某些特定用例的 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
必须恰好达到一次。但是不能保证会是哪个线程。
我处于下一种情况,我使用 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
必须恰好达到一次。但是不能保证会是哪个线程。