In the context of memory ordering, the behavior of atomic read-modify-write (RMW) operations, such as x.exchange(...) with std::memory_order_acq_rel, poses a question: Is this operation treated as a single entity with acquire-release semantics or as a sequence of operations comprising an acquire load followed by a release store?
Standard Perspective: Singular Operation
According to the C standard, an RMW operation is considered a singular operation. This implication arises from its name, which uses the singular form, and the standard's related wording. Therefore, in this context, the x.exchange(...) operation is viewed as a single entity.
Ordering Implications: Potential Reordering
If we consider the standard's perspective, the provided code has the potential to output 0, 1. This possibility arises because the standard is not defined in terms of operation reordering but rather in terms of the synchronization relationship between release and acquire operations.
Specifically, the y.load(acquire) operation does not have a matching release-or-stronger store. Hence, it does not synchronize with any other operation and is effectively treated as a relaxed load (y.load(relaxed)).
Additionally, the x.exchange(1, acq_rel) operation's "acquire" component does not have any stores to synchronize with, rendering its acquire semantics effectively relaxed. This effectively transforms it into a x.store(1, release) operation.
As there are no operations before the store and after the load on x in the respective threads, the potential synchronization between these operations becomes redundant. Consequently, both loads can return either 0 or 1, allowing for the output 0, 1.
Conclusion
From the perspective of the C standard, an atomic read-modify-write operation is considered a single operation. This understanding implies that, in the provided example, the code has the potential to print 0, 1 due to the lack of synchronization between the loads and stores.
The above is the detailed content of Is an Atomic Read-Modify-Write a Singular Operation or a Sequence of Acquire-Release Operations?. For more information, please follow other related articles on the PHP Chinese website!