当设置检查 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
下面的代码是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