2013-11-14 2 views
5

В чем причина того, что std::atomic<T>::compare_exchange_* принимает ожидаемое значение по ссылке, вместо того, чтобы принимать его по стоимости?Почему std :: atomic's compare_exchange принимает ссылку для ожидаемого значения?

+1

Потому что, когда вы берете его по стоимости, делается копия. –

+5

Потому что 'ожидаемый' является внеоценкой, когда' expected! = * This' – Praetorian

+1

Пока указатель будет работать, ссылки запрещают нулевые указатели –

ответ

6

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

2

Вот общая схема использования:

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

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

Смежные вопросы