使用Interlocks进行线程同步并保持缓存一致性

时间:2011-07-01 02:30:26

标签: c++ multithreading caching synchronization interlocked

如果我使用某种算法对C ++中的变量使用InterlockCompareExchange操作来确定特定线程是否正在写入一组数据(通过创建我自己的小锁),我该如何确保如果数据存储在i7上的2级缓存中,则另一个线程会立即看到更新该值的互锁操作。

我知道缓存一致性用于保持多核处理器缓存中的数据一致,但是当一个核心使用互锁功能更新变量并且缓存检查并修复一致性问题时,小时间框架如何呢?而另一个核心是检查它在自己的缓存中的变量?如果我确保具有InterlockCompareExchange操作的变量是易失性的,那么这个问题是否会被修复,以便将更改直接写入内存?我是否正确认为内存屏障(VS上的MemoryBarrier())不能确保缓存一致性,但只能确保不需要的指令重新排序?

我希望我的问题不要太模糊。如果我是的话,我会尽力回答任何评论。我没有任何源代码可以发布这个问题,因为我没有任何具体问题,但是想知道将来参考是否有任何问题,尤其是c ++ 0x有互锁作为一部分它的标准库。

谢谢。

1 个答案:

答案 0 :(得分:1)

编译器无法在互锁函数调用中重新排序加载或存储,并且实现将包括确保CPU内核不需要的任何机器指令。

始终保持缓存一致性,唯一需要担心的是当值实际从指令管道写入缓存时,这是一个排序问题。