首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何自动更新最大值?

如何自动更新最大值?
EN

Stack Overflow用户
提问于 2013-04-24 18:52:13
回答 1查看 9.7K关注 0票数 45

在串行代码中,最大值的更新可以简单地通过以下方式完成

代码语言:javascript
复制
template<typename T>
void update_maximum(T& maximum_value, T const& value) noexcept
{
  if(value > maximum_value) maximum_value = value;
}

但是,对于保存最大值的atomic<T>变量,应该如何做到这一点:

代码语言:javascript
复制
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>实现可能附带的锁)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-04-24 19:28:25

在单个操作中这似乎是不可能的,但您可以创建一个循环,尝试这样做,直到它最终成功或原子变量中的值变得大于value

代码语言:javascript
复制
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))
        {}
}
票数 47
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16190078

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档