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

如何实现原子化比较并在值不等时存储待比较值?

原子化实现“不等则替换”操作

你给出的代码问题在于,AT.load()和AT.store(a)是两个独立的原子操作,但整个“判断不等→替换”的逻辑不是原子的。在多线程场景下,这两步之间其他线程可能修改AT的值,导致逻辑出错——比如刚判断完AT != a,还没执行store,其他线程已经把AT改成a了,这时候再执行store就是多余的,甚至可能覆盖其他线程的合法修改。

要原子化完成这个逻辑,需要用到C++原子库提供的**比较并交换(Compare-and-Exchange)**操作,具体是std::atomic的compare_exchange_weak或compare_exchange_strong方法。这两个方法能原子性地完成“比较原子变量与期望值,相等则替换为新值,否则更新期望值为原子变量当前值”的操作。

针对你的需求,实现代码如下:

#include <iostream>
#include <atomic>

int main() {
    static std::atomic<int> AT(23);
    int a = 32;
    
    int expected = AT.load();
    // 循环直到:要么AT原本就是a,要么成功将AT替换为a
    while (expected != a && !AT.compare_exchange_weak(expected, a)) {
        // 每次compare_exchange失败时,expected会被自动更新为AT的当前值
    }

    // 可选:判断是否执行了替换操作
    if (expected != a) {
        std::cout << "not equal, updated AT to " << a << std::endl;
    }
}

说明:

  • compare_exchange_weak可能会出现“伪失败”(即使原子变量值和期望值相等,也可能返回false),所以需要配合循环使用,不过它的性能通常比compare_exchange_strong更好。
  • 如果不需要考虑伪失败的情况,可以用compare_exchange_strong,但同样建议保留循环,因为多线程环境下原子变量的值可能在循环过程中被其他线程修改。
  • 整个循环逻辑是原子性的,确保“判断不等→替换”的操作不会被其他线程打断。

内容的提问来源于stack exchange,提问作者Harry

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 01:02:41