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