为什么std :: atomic的compare_exchange会获取期望值的引用?

Col*_*nee 7 c++ atomic c++11

std::atomic<T>::compare_exchange_*通过引用获取预期值的原因是什么,而不是按值计算?

zch*_*zch 7

compare_exchange_*变化expected,如果操作失败,实际值.它使循环更简单.


Dan*_*lKO 5

这是一个常见的使用模式:

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
}
Run Code Online (Sandbox Code Playgroud)

可以返回 apair<bool,T>相反,但对于这个用例来说不太方便。它可以返回另一个参数中的值,但您必须expected在再次尝试之前手动复制到其中。

恕我直言,这是一个很好的权衡,尽管它不会让您在第一个参数中传递常量(因为这是一个罕见的用例)。