В серийном коде обновление максимального значения может быть выполнено просто
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>
).