Почему std::atomic's Compare_exchange принимает ссылку на ожидаемое значение?

В чем причина std::atomic<T>::compare_exchange_* принять ожидаемое значение по ссылке, а не по значению?

2 ответа

Решение

compare_exchange_* изменения expected к фактическому значению, если операция не удалась Это делает петли немного проще.

Вот общий шаблон использования:

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 вручную, прежде чем пытаться снова.

ИМХО, это хороший компромисс, хотя он не позволит вам передать константу в первом аргументе (так как это редкий случай использования).

Другие вопросы по тегам