我正在阅读 Joe Duffy 的关于Volatile 读写和及时性的帖子,并且我试图了解有关帖子中最后一个代码示例的一些信息:
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
while (Interlocked.CompareExchange(ref m_state, 1, 0) != 0) ;
m_state = 0;
…
当执行第二个 CMPXCHG 操作时,它是否使用内存屏障来确保 m_state 的值确实是写入它的最新值?还是只使用已经存储在处理器缓存中的一些值?(假设m_state未声明为 volatile)。
如果我理解正确,如果 CMPXCHG 不使用内存屏障,那么整个锁获取过程将不公平,因为第一个获取锁的线程很可能是获取所有锁的线程以下锁。我是否理解正确,或者我在这里错过了什么?
编辑:主要问题实际上是在尝试读取 m_state 的值之前调用 CompareExchange 是否会导致内存障碍。因此,当他们再次尝试调用 CompareExchange 时,是否所有线程都可以看到分配 0。