gpt4 book ai didi

c# - Interlocked.CompareExchange 是否使用内存屏障?

转载 作者:IT王子 更新时间:2023-10-29 04:46:39 32 4
gpt4 key购买 nike

我正在阅读 Joe Duffy 关于 Volatile reads and writes, and timeliness 的帖子,我正在尝试了解帖子中最后一个代码示例的一些内容:

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 不使用内存屏障,那么整个锁获取过程将不公平,因为第一个获取锁的线程很可能是将获取的线程 < strong>所有以下锁。我的理解是否正确,还是我错过了什么?

编辑:主要问题实际上是在尝试读取 m_state 的值之前调用 CompareExchange 是否会导致内存障碍。因此,当所有线程尝试再次调用 CompareExchange 时,分配 0 是否对所有线程可见。

最佳答案

任何具有lock 前缀的x86 指令都具有完整内存屏障。如 Abel 的回答所示,Interlocked* API 和 CompareExchanges 使用以 lock 为前缀的指令,例如 lock cmpxchg。所以,这意味着内存栅栏。

是的,Interlocked.CompareExchange 使用内存屏障。

为什么?因为 x86 处理器这样做了。来自英特尔的 Volume 3A: System Programming Guide Part 1 , 第 7.1.2.2 节:

For the P6 family processors, locked operations serialize all outstanding load and store operations (that is, wait for them to complete). This rule is also true for the Pentium 4 and Intel Xeon processors, with one exception. Load operations that reference weakly ordered memory types (such as the WC memory type) may not be serialized.

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

关于c# - Interlocked.CompareExchange 是否使用内存屏障?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1581718/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com