在串行代码,更新最大可以简单地通过以下方式实现
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>