在串行代码中,更新最大值可以简单地通过
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/