很抱歉,如果这是非常基本的。这是我正在做的简化版本。我正在写一个内核模块。当它运行时会有两个线程,一个是两个不同的物理CPU。我正在使用全局变量在这些线程之间进行某些通信。奇怪的是,有时一个线程的写入只是另一个没有看到。可能是什么原因?
我怀疑它与内存屏障和缓存同步有关,所以我尝试在写入后使用smp_wmb(),但它似乎没有帮助。据我所知,我无法明确控制缓存同步。所以我有点卡住了。
有什么想法吗?
编辑:明确说明是简化版本。
答案 0 :(得分:0)
首先,你做错了。 CPU之间的适当同步非常复杂,而且非常具体的架构。您应该使用一些现有的内核机制进行线程同步。除非您有一些特定的性能需求,否则只需使用自旋锁即可。然后,如果需要,您可以阅读更多有关不同同步机制的内容,并找到最适合您工作负载的机制。
更直接地回答您的问题 - 您可能会遇到至少两个问题:
1.编译器的指令重新排序,通常由编译器障碍(即barrier()
)处理。
2. CPU和缓存一致性的乱序执行,通常由内存屏障处理。
详细信息是特定于体系结构和用例,但您未提供我们可以分析的任何代码或体系结构详细信息。因此,您可能需要至少使用barrier()
,smp_wmb()
,smp_rmb()
和smp_read_barrier_depends()
中的任何一个。
答案 1 :(得分:-1)
由于编译器优化,我认为您正面临着这个问题。
您是否尝试过使用volatile
?我认为volatile
适用于您的情况。
应该使用volatile
关键字,对来自多个源(进程)的变量执行并发的非同步操作。如果变量被声明为volatile,则所有进程将始终直接从其内存位置访问变量,而不是复制微处理器缓存中的变量并从那里访问它。