Подтвердить что ты не робот

Как атомно обновлять максимальное значение?

В серийном коде обновление максимального значения может быть выполнено просто

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

Однако как это сделать для переменной atomic<T>, содержащей максимальное значение:

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

Очевидно, что код из серийной версии не работает, поскольку другой поток может изменить maximum_value между загрузкой и хранилищем. Можно ли использовать compare_exchange (который сравнивает ==, а не >), чтобы реализовать это? как?

Обратите внимание, что явные блокировки не разрешены (разрешена только блокировка, которая может иметь реализацию std::atomic<T>).

4b9b3361

Ответ 1

Кажется, что это невозможно в одной операции, но вы можете сделать цикл, который пытается это сделать, пока он окончательно не достигнет успеха или значение в атомной переменной станет больше, чем 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))
        ;
}