The acquire/release pattern you implement here is exactly what the Linux kernel's smp_wmb()/smp_rmb() barriers and C11's memory_order_acquire/release provide, and getting it wrong was the exact bug behind the famous 'double-checked locking is broken' discovery in Java that led to the JSR-133 fix of the Java Memory Model in Java 5. Lock-free data structures throughout real codebases, including the Linux kernel's RCU subsystem, depend on precisely this ordering discipline to avoid subtle, hard-to-reproduce concurrency bugs.