如何自动更新最大值?

问题描述 投票:37回答:1

在串行代码中,只需通过以下操作即可完成最大值的更新:>

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>的实现可能附带的锁。

在串行代码中,仅通过模板即可简单地完成最大值的更新。似乎不可能在单个操作中完成,但是您可以创建一个循环,尝试执行此操作,直到最终成功或原子变量中的值变得大于value

c++ c++11 concurrency atomic max
1个回答
© www.soinside.com 2019 - 2024. All rights reserved.