atomic cas

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010339647/article/details/80252940

compare_exchange_weak和compare_exchange_strong则是著名的CAS(compare and set)。
参数会要求在这里传入期待的数值和新的数值。
它们对比变量的值和期待的值是否一致,如果是,则替换为用户指定的一个新的数值。如果不是,则将变量的值和期待的值交换。(zk 注释 那么期待的值就变成了变量最新的值)

https://www.cnblogs.com/dengzz/p/5686866.html

使用举例:

 #include "boost/atomic/atomic.hpp"
 boost::atomic_int32_t _process_num; 
 _num = 6;
 _num.fetch_add(1);
 int stale_num = _num.load();
 //一直循环直到_num为期望的stale_num时(保证上次拿到stale_num之后没有其他线程再来修改这个值),将_num设为123;
 while(_num.compare_exchange_weak(stale_num, 123)) {
}

在执行while循环的时候:
case1:如果_num 不等于 stale_num,则stale_num被修改为process_num最新的值了;return false;
case2:如果_num 等于 stale_num,则_num 被修改为指定的值123;stale_num值不变;return true;

总结:compare_exchange_weak(expect, val)
Case1:如果原子变量的值不等于expect的值,则expect被修改为原子变量的最新值;return false;
case2:如果原子变量到的值等于expect的值,则原子变量的值被修改为val;return true;

猜你喜欢

转载自blog.csdn.net/u010339647/article/details/80252940