// Thread 1:
obj.store(1,Release); // #1
// Thread 2:
obj.store(2, Release); // #2
//Thread 3:
obj.load(Acquire); // #3
obj.load(Relaxed); // #4
Assume #3 reads the value 1 and #4 reads the value 2, it can easily infer that:
#1happens before#3, according to[intro.races] p9.1
A synchronizes with B
#2does not happen before#3, according to[intro.races] p18
If a side effect X on an atomic object M happens before a value computation B of M, then the evaluation B takes its value from X or from a side effect Y that follows X in the modification order of M.
#3happens before#4, according to[intro.races] p10.1
A is sequenced before B
Conjunct the third condition and [intro.races] p16
If a value computation A of an atomic object M happens before a value computation B of M, and A takes its value from a side effect X on M, then the value computed by B is either the value stored by X or the value stored by a side effect Y on M, where Y follows X in the modification order of M.
We may infer that the side effect at #2 follows #1 in the modification order of obj.
So, could we infer that #1 happens before #2 according to [intro.races] p15
If an operation A that modifies an atomic object M happens before an operation B that modifies M, then A is earlier than B in the modification order of M.
It appears to me that "A is earlier than B in M" is only a necessary condition for "A happens before B", in other words, it seems we cannot infer that #1 happens before #2, right?
Let's look at this sentence again:
This sentence takes the form "if X, then Y" where X is "operations A and B both modify an atomic object M, where A happens before B" and Y is "A is earlier than B in the modification order of M".
However, one cannot logically infer the converse, i.e. "if Y, then X". If A is earlier than B in the modification order of M, one cannot conclude from this rule alone that A happens before B.