【发布时间】:2023-03-27 11:42:01
【问题描述】:
我读过https://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange
以原子方式比较对象表示(C++20 前)的值 *this 与期望的表示(C++20 起),如果 那些是按位相等的,用期望的替换前者(执行 读-修改-写操作)。否则,加载存储的实际值 在 *this 中进入预期(执行加载操作)。
所以我理解的代码就像
bool expected=true;
extern atomic<bool> b = false;
void foo ()
{
//
while(!b.compare_exchange_weak(expected, false));
//
}
在循环运行一次之后(忽略虚假失败),它将失败,并将写入预期的false,因此在第二次迭代中 compare_exchange_weak 将返回成功,尽管 b 尚未更改为 true。但这一切的意义何在?我虽然可以用它作为同步锁,等待其他线程更改b,但现在想不出这个的用法。
来自 cppreference 的示例还表明,在两次调用之后 compare_exchange_strong 将成功。
#include <atomic>
#include <iostream>
std::atomic<int> ai;
int tst_val= 4;
int new_val= 5;
bool exchanged= false;
void valsout()
{
std::cout << "ai= " << ai
<< " tst_val= " << tst_val
<< " new_val= " << new_val
<< " exchanged= " << std::boolalpha << exchanged
<< "\n";
}
int main()
{
ai= 3;
valsout();
// tst_val != ai ==> tst_val is modified
exchanged= ai.compare_exchange_strong( tst_val, new_val );
valsout();
// tst_val == ai ==> ai is modified
exchanged= ai.compare_exchange_strong( tst_val, new_val );
valsout();
}
结果:
ai= 3 tst_val= 4 new_val= 5 exchanged= false
ai= 3 tst_val= 3 new_val= 5 exchanged= false
ai= 5 tst_val= 3 new_val= 5 exchanged= true
【问题讨论】:
-
compare_exchange为您提供同步交易风格。如果交易失败,重新计算结果并再次尝试提交。 -
@rustyx 不,没有解释 std::atomic::compare_exchange 应该在哪里和什么地方使用
-
“我真的不明白 [it] ...这一切有什么意义?” 问题可能过于宽泛,无法获得您正在寻找的特定答案为了。你要的是真实世界的例子吗?
-
@DrewDormann 是的,我现在不太明白他的用途和意义是什么
标签: c++ multithreading c++11 std atomic