On Thu, 2017-10-19 at 13:58 +0200, Mattias Rönnblom wrote: > Hi. > > I have this code: > > #include <stdatomic.h> > > int ready; > int message; > > void send_x4711(int m) { > message = m*4711; > atomic_thread_fence(memory_order_release); > ready = 1; > } > > When I compile it with GCC 7.2 -O3 -std=c11 on x86_64 it produces the > following code: > > send_x4711: > .LFB0: > .LVL0: > imul edi, edi, 4711 > .LVL1: > mov DWORD PTR ready[rip], 1 > mov DWORD PTR message[rip], edi > ret > > I expected the store to 'message' and 'ready' to be in program order. > > Did I misunderstand the semantics of > atomic_thread_fence+memory_order_release?
Yes. You must make your program data-race-free. This is required by C11. No other thread can observe "ready" without a data race or other synchronization, so the fence is a noop in this program snippet.