原子上更新最大值
updating maximum value atomically
以下代码是更新原子变量的最大值的正确实现吗?std::memory_order_relaxed
的使用是否正确,失败正确且最佳?
template<typename T>
inline void update_max(std::atomic<T> & atom, const T val)
{
for(T atom_val=atom;
atom_val < val &&
!atom.compare_exchange_weak(atom_val, val, std::memory_order_relaxed);
);
}
请注意,这个问题基本上解决了相同的问题(尽管在特定的上下文中(,但是(接受的(答案不是结论性的,特别是关于记忆顺序,(并且可能已过时(。
<</p>用线程安全方式更新最大值的策略是正确的。
由于您未显示的代码,内存排序是否正确。如果除了报告值(即对其他内存操作的依赖关系(以外的任何上下文中都没有使用原子最大值,则您可能会逃脱std::memory_order_relaxed
。
正如我在评论中提到的那样,在X86
上,编译器可能会产生相同的装配说明,而不管使用内存订购参数如何。 X86
是一个强烈订购的CPU,这意味着(默认情况下(不允许#LoadLoad
和#LoadStore
重新排序。因此,您找不到(理智的(编译器,该编译器会在seq_cst
load
周围发出内存围栏。(默认情况下,#StoreLoad
仍允许重新排序,但是为了防止seq_cst
排序的订购,通常在store
侧处理(。
至于compare_exchange_weak
(一个读取模式 - 工具(,这需要锁定缓存线才能为原子;您将在X86
上看到这些汇编说明:lock cmpxchg
由于这也是一个完整的内存障碍,因此消除了对其他围栏的需求。
请注意,如果您在任何原子操作上使用std::memory_order_relaxed
,则编译器仍然可以自由应用编译时间重新排序
相关文章:
- 比较并显示使用最小值(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) 分量的最小值/最大值分开?
- 如何在一定范围内将无锁更新索引设置为最大值
- 原子上更新最大值
- 用于在具有更新查询的二维矩阵中查找最大值的最佳数据结构
- 如何自动更新最大值
- 正在更新多个线程中的最大值