Wal*_*ter 36 c++ concurrency atomic max c++11
在串行代码中,更新最大值可以简单地通过
template<typename T>
void update_maximum(T& maximum_value, T const& value) noexcept
{
if(value > maximum_value) maximum_value = value;
}
Run Code Online (Sandbox Code Playgroud)
但是,如何对atomic<T>
保存最大值的变量执行此操作:
template<typename T>
void update_maximum(std::atomic<T>& maximum_value, T const& value) noexcept
{
// want a lock-free, thread-safe implementation
}
Run Code Online (Sandbox Code Playgroud)
显然,串行版本的代码不起作用,因为另一个线程可能maximum_value
在加载和存储之间发生变化.可以使用compare_exchange
(比较==
而不是>
)来实现这个吗?怎么样?
请注意,不允许显式锁定(允许的唯一锁定是执行时可能出现的锁定std::atomic<T>
).
zch*_*zch 39
它似乎不可能在单个操作中,但你可以创建一个循环,试图这样做,直到它最终成功或原子变量中的值变得大于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))
;
}
Run Code Online (Sandbox Code Playgroud)