std::atomic<T>::compare_exchange_*
通过引用获取预期值而不是按值获取值的原因是什么?
答案 0 :(得分:7)
compare_exchange_*
会将expected
更改为实际值。它使循环更简单。
答案 1 :(得分:3)
这是一种常见的使用模式:
atomic<int> foo;
int expected = 3;
while(!foo.compare_exchange_strong(expected, 4)) {
// somebody beat us to it
// now decided what to do; break the loop? try again?
if (expected == 4) {
// somebody already wrote a 4 there
break;
} // otherwise keep trying
}
它可以返回pair<bool,T>
,但对于这个用例来说不太方便。 可以在另一个参数中返回该值,但您必须在再次尝试之前手动复制到expected
。
恕我直言,这是一个很好的权衡,即使它不会让你在第一个参数中传递一个常量(因为这是一个罕见的用例)。