The enumeration memory_order specifies the detailed regular
(non-atomic) memory synchronization order as defined in
[intro.multithread] and may provide for operation ordering.
Its
enumerated values and their meanings are as follows:
memory_order::release, memory_order::acq_rel, and
memory_order::seq_cst: a store operation performs a release operation on the
affected memory location.
memory_order::acquire, memory_order::acq_rel, and
memory_order::seq_cst: a load operation performs an acquire operation on the
affected memory location.
Atomic operations specifying memory_order::relaxed are relaxed
with respect to memory ordering.
Implementations must still guarantee that any
given atomic access to a particular atomic object be indivisible with respect
to all other atomic accesses to that object.
An atomic operation A that performs a release operation on an atomic
object M synchronizes with an atomic operation B that performs
an acquire operation on M and takes its value from any side effect in the
release sequence headed by A.
A and B are not
the same atomic read-modify-write operation, and
there exists an atomic modification X of M
such that A reads the value stored by X and
X precedes B
in the modification order of M, or
There is a single total order S
on all memory_order::seq_cst operations, including fences,
that satisfies the following constraints.
First, if A and B are
memory_order::seq_cst operations and
A strongly happens before B,
then A precedes B in S.
Second, for every pair of atomic operations A and
B on an object M,
where A is coherence-ordered before B,
the following four conditions are required to be satisfied by S:
This definition ensures that S is consistent with
the modification order of any atomic object M.
It also ensures that
a memory_order::seq_cst load A of M
gets its value either from the last modification of M
that precedes A in S or
from some non-memory_order::seq_cst modification of M
that does not happen before any modification of M
that precedes A in S.
memory_order::seq_cst ensures sequential consistency only
for a program that is free of data races and
uses exclusively memory_order::seq_cst atomic operations.
Any use of weaker ordering will invalidate this guarantee
unless extreme care is used.
In many cases, memory_order::seq_cst atomic operations are reorderable
with respect to other atomic operations performed by the same thread.
For example, with x and y initially zero,
// Thread 1:
r1 = y.load(memory_order::relaxed);
x.store(r1, memory_order::relaxed);
// Thread 2:
r2 = x.load(memory_order::relaxed);
y.store(r2, memory_order::relaxed);
this recommendation discourages producing r1 == r2 ==42, since the store of 42 to y is only
possible if the store to x stores 42, which circularly depends on the
store to y storing 42.
Note that without this restriction, such an
execution is possible.
Atomic read-modify-write operations shall always read the last value
(in the modification order) written before the write associated with
the read-modify-write operation.
Recommended practice: The implementation should make atomic stores visible to atomic loads,
and atomic loads should observe atomic stores,
within a reasonable amount of time.