如何自动更新最大值?

时间:2013-04-24 10:52:13

标签: c++ c++11 concurrency atomic max

在串行代码中,只需通过

即可更新最大值
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>的实现可能带来的锁定。)

1 个答案:

答案 0 :(得分:36)

在单个操作中似乎不可能,但你可以创建一个循环,试图这样做,直到它最终成功或原子变量中的值变得大于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))
        ;
}