如何自动更新最大值
How to atomically update a maximum value?
在串行代码中,更新最大值只需使用
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))
{}
}
相关文章:
- 比较并显示使用最小值(a,b)和最大值(a、b)升序排列的4个数字
- 使用指针从C++中的数组中获取最大值
- 如何将这个C++哈希表转换为动态扩展和收缩,而不是使用硬设置的最大值
- 如何创建一个函数来计算并返回平均值、最大值和最小值
- 在二维数组中查找最小值和最大值?
- 整数溢出,最大值为 pow(10,19)
- 以C++递归方式查找向量中的最大值
- C++ - 如何在结构向量中找到结构体一个成员的最大值?
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- C++ 函数,用于查找传入的 N 个数字的平均值、总和、最小值和最大值
- 我的 If Else 语句无法在向量 (C++) 中提供最大值
- 如何使用可变参数模板类使用模板元编程获得最大值
- C++不同的最小最大值实现
- Vec3b:r/g/b 颜色的最大值为 254,而不是 255
- CUDA - 将 float3 数组的 (x,y,z) 分量的最小值/最大值分开?
- 如何在一定范围内将无锁更新索引设置为最大值
- 原子上更新最大值
- 用于在具有更新查询的二维矩阵中查找最大值的最佳数据结构
- 如何自动更新最大值
- 正在更新多个线程中的最大值