文章详情
C++中std atomic的操作
Posted on 2023-06-10 03:17:44 by 主打一个C++
std::atomic 操作(如 fetch_add)允许指定内存序(memory order)参数,这用于控制原子操作如何与其他内存操作同步。
内存序参数决定了原子操作的可见性和重排序的规则,影响线程间的数据一致性。
fetch_add 的第二个参数用于指定内存序,默认情况下是 std::memory_order_seq_cst,这是顺序一致性(sequentially consistent)的内存序,确保所有线程看到的操作顺序是一致的。
这种一致性可能会带来一些性能开销,因此 C++ 提供了其他内存序选项供开发者选择,以平衡性能和一致性:
- std::memory_order_relaxed:最宽松的内存序,不保证任何顺序,只保证操作本身是原子的。
- std::memory_order_consume:保证依赖于此操作读取的数据的可见性,但通常等同于 std::memory_order_acquire。
- std::memory_order_acquire:保证在此操作之后的所有读取操作看到的是在另一个线程中释放操作之后的状态。
- std::memory_order_release:保证在此操作之前的所有写入操作的状态在另一个线程中可以被获取操作看到。
- std::memory_order_acq_rel:结合了 acquire 和 release 的特性。
- std::memory_order_seq_cst:顺序一致性,提供最强的保证,所有线程看到的操作顺序是一致的。
示例:
std::atomic<long long> execution_count;
//加1
execution_count.fetch_add(1, std::memory_order_relaxed);
//-1
execution_count.fetch_sub(1, std::memory_order_relaxed);
*转载请注明出处:原文链接:https://cpp.vin/page/132.html