在串行代码中,更新最大值可以简单地通过以下方式完成
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))
{}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)