乐鑫技术交流
直播中

王强

7年用户 1341经验值
私信 关注
[问答]

请问一下可以使用多个内核访问相同的内存地址吗?

我读到 SMP 特性:
对称内存(有一些小例外)。
如果多个内核访问相同的内存地址,它们的访问将在内存总线级别序列化。
通过原子比较实现对相同内存地址的真正原子访问-ISA 提供的交换指令。
那么这是否意味着我可以创建全局变量而不用担心多线程访问?


回帖(3)

曾玲娟

2023-3-1 16:03:25
假设变量是 8 位、16 位或 32 位,并且只能这样访问(如果不是,答案总是“否”):取决于您对“访问”的定义。如果您有一个线程写入它而另一个线程读取它,则没有问题。但是,如果您有一个需要多次访问的操作,您仍然需要线程安全。例如,如果变量用作信号量:线程 1 将变量设置为 1,线程 2 读取变量,如果为 1,则将其清除为 0 并执行某些操作。在那种情况下,读取和写入是两个不同的操作,线程 1 可能会“潜入”另一个“设置为 1”,这会丢失。
举报

唐般远

2023-3-1 16:03:32
如果您不使用原子指令来读/写它,您可能想要记录该变量中永远喜欢的废话。很容易忘记这件事之所以有效,是因为该体系结构恰好自行原子地执行 32 位读/写,将其更改为例如 64 位变量或结构,并在您的程序中引入非常微妙的错误。
举报

贾大林

2023-3-1 16:03:53
我建议在访问这样的结构时简单地使用自旋锁(ESP-IDF 中的 taskENTER_CRITICAL/taskEXIT_CRITICAL)。它可以立即清楚您正在尝试做什么(因此如果您重新设计它,就不会进行猜测或出现错误的可能性)并且只要您正确使用自旋锁,无论体系结构如何,它总是安全的。另一种方法是深入研究内存一致性模型,相信我,您不想每次尝试修复一个简单的错误时都这样做。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分