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))
;
}