You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法使用C++11原子操作,InterlockedCompareExchange原子读取变量用法是否正确?

关于用InterlockedCompareExchange实现原子读取的疑问解答

嘿,我来帮你把这个问题掰明白!

首先得先回忆下InterlockedCompareExchange的核心逻辑:它会原子性地完成三个步骤——读取目标内存地址的当前值,把这个值和第三个参数(comparand)对比,如果相等,就把第二个参数(exchange)写入目标地址,最后返回目标地址的原始值。整个过程不会被其他线程打断。

那你现在写的这段代码:

DWORD dwConnectTime = InterlockedCompareExchange(&msgInfo.m_dwConnectTime, msgInfo.m_dwConnectTime, msgInfo.m_dwConnectTime);

我们拆解下它的实际行为:

  1. 调用函数前,你的线程会先读取msgInfo.m_dwConnectTime的当前值,记为X,把X作为exchange和comparand参数传入。
  2. 进入原子操作流程:
    • 原子性读取&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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:02:54