无法使用C++11原子操作,InterlockedCompareExchange原子读取变量用法是否正确?
关于用InterlockedCompareExchange实现原子读取的疑问解答
嘿,我来帮你把这个问题掰明白!
首先得先回忆下InterlockedCompareExchange的核心逻辑:它会原子性地完成三个步骤——读取目标内存地址的当前值,把这个值和第三个参数(comparand)对比,如果相等,就把第二个参数(exchange)写入目标地址,最后返回目标地址的原始值。整个过程不会被其他线程打断。
那你现在写的这段代码:
DWORD dwConnectTime = InterlockedCompareExchange(&msgInfo.m_dwConnectTime, msgInfo.m_dwConnectTime, msgInfo.m_dwConnectTime);
我们拆解下它的实际行为:
- 调用函数前,你的线程会先读取
msgInfo.m_dwConnectTime的当前值,记为X,把X作为exchange和comparand参数传入。 - 进入原子操作流程:
- 原子性读取
&msgInfo.m_dwConnectTime的实时值,记为Y - 对比
Y和X:- 如果相等:把
X(也就是和Y一样的值)写入目标地址——相当于没做任何修改,然后返回Y - 如果不等:直接返回
Y,不做写入操作
- 如果相等:把
- 原子性读取
不管哪种情况,最终返回的都是msgInfo.m_dwConnectTime的原子快照值,而且整个过程不会被其他线程干扰,完全符合你想要的“原子性读取”的需求。
额外需要注意的点
- 内存可见性:Windows的Interlocked系列函数默认是全内存栅栏(full fence),相当于C++11里的
memory_order_seq_cst,比单纯的acquire语义更强,能保证其他线程对这个变量的修改会被当前线程立刻看到,内存可见性上完全没问题。 - 有没有更直接的方式?其实Windows提供了专门的原子读取函数,比如
InterlockedRead(32位变量)或InterlockedRead64(64位变量),如果你的场景允许使用这些函数,代码会更直观。但如果只能用InterlockedCompareExchange,你的写法是完全安全可行的。
内容的提问来源于stack exchange,提问作者Wad
相关产品推荐
相关产品推荐

