【发布时间】:2016-08-08 17:27:16
【问题描述】:
对不起,如果这是非常基本的。这是我正在做的事情的简化版本。我正在写一个内核模块。当它运行时,将有两个线程一个两个不同的物理 CPU。我正在使用全局变量在这些线程之间进行某些通信。奇怪的是,有时一个线程的写入不会被另一个线程看到。可能是什么原因?
我怀疑它与内存屏障和缓存同步有关,所以我尝试在写入后使用 smp_wmb() ,但它似乎没有帮助。据我所知,我无法显式控制缓存同步。所以我有点卡住了。
有什么想法吗?
编辑:明确说明是简化版。
【问题讨论】:
-
可能有很多东西。由于内核模块让我假设 C,你是否声明了变量 volatile?
-
@GabeSechan 是的,我试过了。
-
遵循其他内核代码使用的模式。此外,除非您正在做一些非常不寻常的事情,否则写入内存屏障应该在写入之前。这个值传达了什么含义?
-
想要具体答案可以提供code或者code sn-ps
-
如果你有两个物理 CPU 实现了 NUMA,如果没有适当的处理,这种行为似乎很合理,无论是在其他可能不会发生的架构上(另请注意,这不是不以正确方式做事的借口)。无论如何,NUMA 与否,你应该read this。
标签: multithreading linux-kernel memory-barriers smp