在串行代码中,只需通过以下操作即可完成最大值的更新:>
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
: