是否互锁。比较Exchange使用内存屏障?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (37)
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
… 

在执行第二个CMP XCHG操作时,它是否使用内存屏障来确保有最新的价值?还是只使用一些已经存储在处理器缓存中的值?

提问于
用户回答回答于

Interlocke比较Exchange使用内存屏障。

为什么?因为x86处理器做到了这一点。

对于P6家族处理器来说,锁定操作序列化所有未完成的加载和存储操作。(也就是说,等待他们完成)。除了一个例外,Pentium 4和Intel Xeon处理器也是如此。不能序列化引用弱有序内存类型(例如WC内存类型)的加载操作。

volatile与这次讨论无关。这是关于原子操作的;为了支持CPU中的原子操作,x86保证所有以前的负载和存储都要完成。

用户回答回答于

ref不尊重平常volatile规则,尤其是在以下方面:

volatile bool myField;
...
RunMethod(ref myField);
...
void RunMethod(ref bool isDone) {
    while(!isDone) {} // silly example
}

这里RunMethod不一定会发现外部更改为isDone即使底层字段(myField)是volatileRunMethod不知道,所以没有正确的代码。

这不应该是一个问题:

  • 如果你用Interlocked,然后使用Interlocked进入外地
  • 如果你用lock,然后使用lock进入外地

行为Interlocked,我不知道它是如何实现的(内存屏障等--注意它们是“InternalCall”方法,所以我无法检查;-p)-但是是的:来自一个线程的更新将立即对所有其他线程可见只要他们使用Interlocked方法。

所属标签

可能回答问题的人

  • 人生的旅途

    10 粉丝484 提问6 回答
  • 无聊至极

    4 粉丝504 提问6 回答
  • 富有想象力的人

    4 粉丝0 提问4 回答
  • 找虫虫

    2 粉丝0 提问4 回答

扫码关注云+社区

领取腾讯云代金券