如何实现原子化比较并在值不等时存储待比较值?
原子化实现“不等则替换”操作
你给出的代码问题在于,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
相关产品推荐
相关产品推荐

