如何自动更新最大值? [英] How to atomically update a maximum value?
问题描述
在序列代码中,更新最大值可以简单地通过
In serial code, updating a maximum could be accomplished simply by
template<typename T>
void update_maximum(T& maximum_value, T const& value) noexcept
{
if(value > maximum_value) maximum_value = value;
}
但是,对于 ; T>
含有最大值的变量:
However, how should this be done for an atomic<T>
variable holding the maximum value:
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
(它比较 ==
而不是>
)来实现这个?如何?
Obviously, the code from the serial version doesn't work, as another thread may alter maximum_value
between the load and the store. Can one use the compare_exchange
(which compares ==
rather than >
) to implement this? how?
请注意,不允许显式锁定(允许的唯一锁定是可能伴随 std :: atomic< T> ;
Note that explicit locks are not allowed (the only lock allowed is that which may come with the implementation of std::atomic<T>
).
推荐答案
在单个操作中似乎不可能,可以做一个循环,尝试这样做,直到它终于成功或原子变量的值变得大于 value
:
It doesn't seem to be possible in a single operation, but you can make a loop, that tries to do this, until it finally succeeds or value in atomic variable becomes bigger than 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))
;
}
这篇关于如何自动更新最大值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!