当设置检查 atomic<bool> 变量时,我应该使用 compare_exchange_weak(或强)吗?

Should I use compare_exchange_weak(or strong) when check atomic<bool> variable is set?

下面的代码是atomic<bool>的用法示例,来自《c++ concurrency in action》第5章。 为什么他们使用 compare_exchange_weak 来检查 b 是否已设置,为什么他们在 while 循环中使用 !expected

bool expected=false;
extern atomic<bool> b; // set somewhere else
while(!b.compare_exchange_weak(expected,true) && !expected);

我可以将上面的代码更改为如下所示的简单代码吗?

extern atomic<bool> b; // set somewhere else
while(!b.load());

哇,这是一段令人困惑的代码。首先显而易见的一点是,compare_exchange_weak 版本(可能)会更改基础原子值的值。 b.load() 没有,所以它们不等价。

解释...

while(!b.compare_exchange_weak(expected,true) && !expected);

b.compare_exchange_weak(预期,真实)说

if b is false make it true, otherwise set expected = b(true)

现在你可能会问,为什么代码要在交换后检查值?
它正在检查是否另一个线程已经设置了该值。这会导致循环退出。但是,如果无论 b 的值是多少,代码都会退出,为什么要循环?

循环存在是因为函数的弱版本什么都不做(无缘无故)。

所以这段代码等同于

b.compare_exchange_strong(expected,true);

我不确定作者为什么不这样写,但我缺少它的上下文。如果有人把它放在生产代码中,上面没有很好的解释性注释,我肯定会遇到问题!

有关详细信息,请参阅 https://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange。 有关类似的讨论,请参阅 https://newbedev.com/understanding-std-atomic-compare-exchange-weak-in-c-11