某些特定用例的 C++ 原子内存排序

C++ atomics memory ordering for some specific use case

我处于下一种情况,我使用 atomic<uint64_t> 作为计数器并从 5 个或更多线程递增它并使用递增之前的值来做出一些决定。

atomic<uint64_t> global_counter;

void thread_funtion(){
    uint64_t local_counter = global_counter.fetch_add(1,std::memory_order_relaxed);
    if(local_counter == 24)
       do_somthing(local_counter);
}

thread_funtion() 将由 5 个不同的线程执行。一旦我得到 local_counter 我的代码就不再关心 global_counter 是否再次更改而 thread_funtion() 是 运行 (业务逻辑是这样的,我只需要每次 thread_function() 调用都有一个唯一的增量值。

在这种情况下使用 std::memory_order_relaxed 安全吗?

atomic<...>::fetch_add(..., std::memory_order_relaxed) 保证原子执行,仅此而已。

但即使使用 memory_order_relaxed,也会有一个线程调用 do_something()。由于此 fetch_add 是对 global_counter 的唯一操作,并且它是原子执行的,因此值 24 必须恰好达到一次。但是不能保证会是哪个线程。