c++ - 如何以原子方式更新最大值?

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

最佳答案

在单个操作中似乎不可能,但您可以创建一个循环,尝试执行此操作,直到它最终成功或原子变量中的值变得大于 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))
        {}
}

关于c++ - 如何以原子方式更新最大值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16190078/

相关文章:

c++ - 有什么方法可以更快地处理 "predictable branches"吗?

c++ - 循环中的虚拟调度

c++ - 当我对 te 输出进行类型转换时得到一个有趣的结果

c++ - 迭代器中reduce和decrease的区别

go - for循环中的Goroutines返回不同的值

java - ConcurrentHashMap 的迭代一致性保证

c++ - 如何使用 type_info 判断一个类型是否是子类?

c++ - 如何将 "using"关键字用于可变参数模板

c++11 和 boost_filesystem cout 和 printf 不起作用

performance - 使用 ssd 和 mmap 改进并发文件读取