C++ atomic_02
Date: 2024-02-27Last modified: 2024-02-27
C++atomicmemory_order_acquirememory_order_consumememory_order_rel_acqmemory_order_relaxedmemory_order_releasememory_order_seq_cst
Table of contents
memory_order_seq_cst
Sequencial Consistent (default if not specified), the compiler may have to:- to perform aditional store flushes
- to perform aditional cache refreshes
- to restrict instruction reordering
- to restrict the optimization
memory_order_relaxed
- get maximum performace avoiding the restrictions above
- you MUST to solve race conditions explicitly
memory_order_acquire
memory_order_release
memory_order_acq_rel
memory_order_consume
Categorization of atomic operations
- Load / acquire operations
memory_order_relaxed
memory_order_consume
memory_order_acquire
memory_order_seq_cst
- Store / release operations
memory_order_relaxed
memory_order_release
memory_order_seq_cst
- Read modify write / acquire release operations
memory_order_relaxed
memory_order_consume
memory_order_acquire
memory_order_release
memory_order_rel_acq
memory_order_seq_cst
⚡
Tip
Atomic store operation tagged with memory_order_release
will have
syncronized with relationship with atomic read operation tagged with
memory_order_acquire
.
std::atomic<int> x;
x.store( 5 );
x.store( 10, std::memory_order_release );
x.load( std::memory_order_acquire );
int value = 11;
bool ret_val = x.compare_exchange_weak(
value, //
13, //
std::memory_order_release, // for success scenario
std::memory_order_relaxed ); // for failure scenario
Possible output