8

std::atomic<T>::compare_exchange_*以引用方式取期望值,而不是取值取值的原因是什么?

4

2 回答 2

8

compare_exchange_*如果操作失败,则更改为expected实际值。它使循环更简单一些。

于 2013-11-14T20:00:20.137 回答
4

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

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
}

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

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

于 2013-11-14T20:48:41.507 回答