为什么一个CPU写的值没有被另一个看到?

时间:2016-08-08 17:27:17

标签: multithreading linux-kernel memory-barriers smp

很抱歉,如果这是非常基本的。这是我正在做的简化版本。我正在写一个内核模块。当它运行时会有两个线程,一个是两个不同的物理CPU。我正在使用全局变量在这些线程之间进行某些通信。奇怪的是,有时一个线程的写入只是另一个没有看到。可能是什么原因?

我怀疑它与内存屏障和缓存同步有关,所以我尝试在写入后使用smp_wmb(),但它似乎没有帮助。据我所知,我无法明确控制缓存同步。所以我有点卡住了。

有什么想法吗?

编辑:明确说明是简化版本。

2 个答案:

答案 0 :(得分:0)

首先,你做错了。 CPU之间的适当同步非常复杂,而且非常具体的架构。您应该使用一些现有的内核机制进行线程同步。除非您有一些特定的性能需求,否则只需使用自旋锁即可。然后,如果需要,您可以阅读更多有关不同同步机制的内容,并找到最适合您工作负载的机制。

更直接地回答您的问题 - 您可能会遇到至少两个问题:    1.编译器的指令重新排序,通常由编译器障碍(即barrier())处理。    2. CPU和缓存一致性的乱序执行,通常由内存屏障处理。

详细信息是特定于体系结构和用例,但您未提供我们可以分析的任何代码或体系结构详细信息。因此,您可能需要至少使用barrier()smp_wmb()smp_rmb()smp_read_barrier_depends()中的任何一个。

答案 1 :(得分:-1)

由于编译器优化,我认为您正面临着这个问题。

您是否尝试过使用volatile?我认为volatile适用于您的情况。

应该使用volatile关键字,对来自多个源(进程)的变量执行并发的非同步操作。如果变量被声明为volatile,则所有进程将始终直接从其内存位置访问变量,而不是复制微处理器缓存中的变量并从那里访问它。