https://en.m.wikipedia.org/wiki/Memory_barrier#Multithreaded_programming_and_memory_visibility You need mfence/lfence/sfence before mutex_lock() returns, and before unlock() returns.