В чем причина того, что std::atomic<T>::compare_exchange_*
принимает ожидаемое значение по ссылке, вместо того, чтобы принимать его по стоимости?Почему std :: atomic's compare_exchange принимает ссылку для ожидаемого значения?
5
A
ответ
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
вручную, прежде чем пытаться снова.
ИМХО это хороший компромисс, хотя он не позволит вам передать константу в первом аргументе (так как это редкий случай использования).
Смежные вопросы
- 1. InterlockedCompareExchange64 vs std :: atomic compare_exchange
- 2. Почему std :: not1() принимает параметр по ссылке const вместо значения?
- 3. Почему std :: next не принимает InputIterator?
- 4. Почему std :: remove принимает версию итераторов const?
- 5. Почему std :: cin принимает несколько входов одновременно?
- 6. Почему std :: copy_n принимает параметр шаблона вместо std :: size_t?
- 7. Почему `std :: sample` принимает` UniformRandomBitGenerator` как &&?
- 8. Почему Go ломтик `append()` не принимает ссылку?
- 9. Почему Date принимает отрицательные значения?
- 10. Почему шаблонная ссылка rvalue принимает значения lvalues?
- 11. Беспомощное хэширование без std :: atomics гарантируется потокобезопасность в C++ 11?
- 12. std :: map не принимает мой оператор <
- 13. Повышение связывания функции принимает ссылку
- 14. Почему конструкторы const std :: string возвращают ссылку?
- 15. Почему std :: atomic_thread_fence имеет ссылку «C»?
- 16. std :: getline не принимает std :: back_insert_iterator
- 17. Почему компилятор позволяет отправлять ссылку на итератор в функции, которая принимает ссылку на const iterator?
- 18. Неблокирующий способ копирования Atomics в Copy Constructor
- 19. Функция принимает массив ожидаемого размера, показывая, что для пользователя
- 20. gcc atomics поддерживаемые типы
- 21. OpenCL atomics ничего не делать
- 22. Почему std :: thread принимает функтор посредством ссылки пересылки
- 23. Lock Free Bounded Stack C++ 11 atomics
- 24. Почему std :: num_put принимает параметр ios_base посредством ссылки не const?
- 25. Почему у std :: ratio нет значения?
- 26. Почему Hashset не принимает повторяющиеся значения?
- 27. Почему Firefox не принимает значения нижнего% заполнения?
- 28. Почему запрос принимает навсегда при изменении значения
- 29. Почему std :: shared_ptr не принимает мой объект функции deleter?
- 30. Почему std :: experimental :: filesystem :: path не принимает подстановочные знаки типа «*»?
Потому что, когда вы берете его по стоимости, делается копия. –
Потому что 'ожидаемый' является внеоценкой, когда' expected! = * This' – Praetorian
Пока указатель будет работать, ссылки запрещают нулевые указатели –