On Thu, 2017-10-19 at 13:18 +0100, Andrew Haley wrote: > On 19/10/17 13:10, Jonathan Wakely wrote: > > There are no atomic operations on atomic objects here, so the fence > > doesn't synchronize with anything. > > Really? This seems rather unhelpful, to say the least. > > An atomic release operation X in thread A synchronizes-with an acquire > fence F in thread B, if > > there exists an atomic read Y (with any memory order) > Y reads the value written by X (or by the release sequence headed by X) > Y is sequenced-before F in thread B
You write that X is an _atomic_ release operation, but that would have to be an atomic memory_order_release store. Alternatively, it would have to be an atomic memory_order_relaxed store sequenced after a release fence. There are only nonatomic stores in this example, so reordering them before the release fence is not observable in a correct program (ie, a data-race-free one).