gpt4 book ai didi

c++ - 原子更新最大值

转载 作者:搜寻专家 更新时间:2023-10-31 02:10:44 39 4
gpt4 key购买 nike

以下代码是否是更新原子变量最大值的正确实现? 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);
);
}

请注意 this question解决了本质上相同的问题(尽管在特定上下文中),但(已接受的)答案不是决定性的,特别是关于内存顺序,(并且可能已过时)。

最佳答案

用于以线程安全方式自动更新最大值的策略是正确的。

由于您没有显示代码,无法判断内存排序是否正确。如果除了报告一个值(即不依赖于其他内存操作)之外,没有在任何上下文中使用原子最大值,您可能会使用 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,编译器仍然可以自由应用编译时重新排序

关于c++ - 原子更新最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44800510/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com