
Dave Abrahams wrote:
on Sat Aug 27 2011, Gottlob Frege <gottlobfrege-AT-gmail.com> wrote:
There is no "synchronizes with" (standard's wording) because synch-with requires thread 2 to *read* the value written into the atomic by thread 1. We have no reads here - no if statement - so reordering doesn't matter. I don't think the standard disallows the reordering of i and j, even if they are atomics.
IIUC from the point of view of programs without undefined behavior, the standard disallows reordering in both cases.
The standard prescribes UB in the case of lock-free non-atomic observer loads (the program is well-defined in the case of relaxed lock-free atomic stores and loads to observe the reordering of two stores). In reality, the generated code is the same (irrespective of whether the code uses relaxed atomic stores/loads versus ordinary stores/loads). The standard allows reordering in both cases. The only difference is UB imposed by fiat in one case and no UB in another case. regards, alexander.