如何原子更新最大值?(How to atomically update a maximum valu

2019-09-01 00:53发布

在串行代码,更新最大可以简单地通过以下方式实现

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>

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


文章来源: How to atomically update a maximum value?