diff --git a/xml/issue4004.xml b/xml/issue4004.xml new file mode 100644 index 0000000000..d5230215eb --- /dev/null +++ b/xml/issue4004.xml @@ -0,0 +1,65 @@ + + + + +The load and store operation in §[atomics.order] p1 is ambiguous +
+jim x +30 Oct 2023 +99 + + +

+ p1 says: +

+
+
    +
  1. (1.2) — memory_order::release, memory_order::acq_rel, and memory_order::seq_cst: a store operation +performs a release operation on the affected memory location.

  2. +
  3. (1.3) — memory_order::consume: a load operation performs a consume operation on the affected memory location. +[…]

  4. +
  5. (1.4) — memory_order::acquire, memory_order::acq_rel, and memory_order::seq_cst: a +load operation performs an acquire operation on the affected memory location.

  6. +
+
+

+What do the store and load operations intend to mean in this context? If there is no extra specification, +it is easy to consider them as the operations performed by the non-static member functions "store" and "load" +defined in the atomic class (template). +

+ p2 says +

+
+

+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. +

+
+

+According to the above interpretation, A is an operation performed by the non-static member function +store, however, I think the following example can establish the synchronization relationship +

+
+std::atomic<int> x{0};
+Thread 1:
+int expected = 0;
+x.compare_exchange_strong(expected, 1, memory_order::release, memory_order::relaxed ); //#1
+
+Thread 2:
+int expected = 1;
+while(x.compare_exchange_strong( expected, 2, memory_order::acquire, memory_order::relaxed )){} // #2
+
+

+Assuming the RMW operations are successful in the two threads, I think #1 intends to perform a +release operation while #2 performs an acquire operation, and hence they can establish the +synchronization relationship, however, they both are RMW operations. +

+It should be clearly defined which are store operations and which are load operations. +

+
+ + + + +