Compiler optimization ke liye reorder karta hai (register allocation, hoisting).
CPU out-of-order aur speculatively execute karta hai.
Cache/store buffers delay karte hain jab ek write doosre cores ko visible hoti hai.
Ek naive flag jaise bool ready = truekoi guarantee nahi deta ki woh data jo aapne usse pehle likha, woh visible hoga jab doosra thread ready == true dekhe. Yahi woh bug hai jo acquire-release fix karta hai.
Do dost notes pass karte hain. Ravi ek kaagaz par ek secret likhta hai (data), phir mailbox par ek flag lagata hai (atomic). Maya mailbox check karti rehti hai; jis pal woh flag dekhe, is game ka rule guarantee karta hai ki secret andar hai — woh kabhi khaali box nahi kholegi. "Flag lagao" = release (pehle likhna khatam karo, phir signal do). "Flag dekho aur kholo" = acquire (signal dekhte hi, aap sab kuch padh sakte ho). Agar yeh rules skip karo (relaxed), Maya flag dekh sakti hai lekin box khol sakti hai Ravi ke likhna khatam karne se pehle — garbage milega. Flag tabhi kaam karta hai jab Maya wahi exact flag dekhe jo Ravi ne uthaya — yahi "stored value ko read karna zaruri hai" hai.
Sequenced-before (intra-thread) aur synchronizes-with (cross-thread atomic edges) ka transitive closure. Agar A hb B hai, toh B A ke saare side effects dekhta hai.
Release-store kab acquire-load ke saath synchronize karta hai?
Jab acquire-load woh value padhta hai jo release-store ne likhi thi (ya uski release sequence mein baad ki value).
memory_order_release kaunsi ordering guarantee karta hai?
Store se pehle koi memory operation us ke baad reorder nahi ho sakti (downward barrier); uske pehle ki writes matching acquire ko visible ho jaati hain.
memory_order_acquire kaunsi ordering guarantee karta hai?
Load ke baad koi memory operation us se pehle reorder nahi ho sakti (upward barrier); yeh publisher ki release se pehle ki writes dekhta hai.
Yeh ek single global total order add karta hai jis par saare seq_cst operations agree karte hain, inconsistent observations ko rokta hai (jaise IRIW).
Edge banane ke liye acquire-load ko stored value kyun read karni chahiye?
Synchronization data flow follow karta hai; agar load ne purani value paadhi toh usne release observe nahi kiya, toh writer ka pehle ka kaam inherit nahi karta.
Message-passing example mein assert(data==42) guaranteed kyun hai?
data=42 →(seq-before) release-store →(sync-with) acquire-load →(seq-before) assert, ek hb chain banta hai toh reader data dekhta hai.