Почему 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
вручную, прежде чем пытаться снова.
ИМХО, это хороший компромисс, хотя он не позволит вам передать константу в первом аргументе (так как это редкий случай использования).