0

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

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

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

谢谢你。

4

1 回答 1

1

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

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

于 2011-07-01T02:33:49.343 回答