thread 1 thread 2 thread 3 thread 4
-------- -------- -------- --------
x=1; r1=x x=3; r3=x;
x=2; r2=x x=4; r4=x;
Even with relaxed memory ordering, all modifications to x have to occur in some particular total order, called the modification order of x.
So, even if each thread preserves its store order, the modification order of x can be any of:
1,2,3,4
1,3,2,4
1,3,4,2
3,1,2,4
3,1,4,2
3,4,1,2
Because there is a single modification order for x, it would be an error for thread 2 and thread 4 to see a different update order.