populares para likes hastags hashtags for cool c++ c++11 concurrency atomic max

c++ - para - hastags



¿Cómo actualizar atómicamente un valor máximo? (1)

En el código de serie, la actualización de un máximo podría realizarse simplemente

template<typename T> void update_maximum(T& maximum_value, T const& value) noexcept { if(value > maximum_value) maximum_value = value; }

Sin embargo, ¿cómo se debe hacer esto para una variable atomic<T> que tiene el valor máximo:

template<typename T> void update_maximum(std::atomic<T>& maximum_value, T const& value) noexcept { // want a lock-free, thread-safe implementation }

Obviamente, el código de la versión en serie no funciona, ya que otro hilo puede alterar el valor maximum_value entre la carga y el almacén. ¿Se puede usar el compare_exchange (que compara == lugar de > ) para implementar esto? ¿cómo?

Tenga en cuenta que los bloqueos explícitos no están permitidos (el único bloqueo permitido es el que puede venir con la implementación de std::atomic<T> ).


No parece ser posible en una sola operación, pero puede hacer un bucle que intente hacer esto, hasta que finalmente tenga éxito o el valor en la variable atómica se haga más grande que el value :

template<typename T> void update_maximum(std::atomic<T>& maximum_value, T const& value) noexcept { T prev_value = maximum_value; while(prev_value < value && !maximum_value.compare_exchange_weak(prev_value, value)) ; }