【发布时间】:2013-04-17 21:23:26
【问题描述】:
在串行代码中,更新最大值可以简单地通过
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> 的实现可能附带的锁)。
【问题讨论】:
标签: c++ c++11 concurrency atomic max