Socho ek shared piggy bank hai aur do bacche dono ek coin add kar rahe hain. Agar dono andar jhaanken ("5 coins"), har ek sochta hai "ab 6", aur dono label par 6 likhte hain — ek coin ka count gum ho gaya. Ek atomic operation ek magical haath ki tarah hai jo ek blink mein pakadta, ginata, aur update karta hai taaki beech mein koi jhaank na sake. Lock-free matlab humein bank par padlock nahi lagana (koi line mein wait nahi) — magic bank mein hi built-in hai. Aur memory order woh rule hai jo kehta hai: agar main box par ek note chhod deta hoon "main ho gaya", jo bhi woh note padhega woh sab kuch bhi dekhega jo maine andar pack kiya tha.
std::atomic<T> kya guarantee karta hai jo plain T nahi karta?
Operations indivisible (atomic) hain aur ek chosen memory order follow karte hain, threads ke across torn reads aur lost updates prevent hote hain.
Plain counter++ threads ke across unsafe kyun hai?
Yeh ek load–add–store sequence hai; threads steps ke beech interleave ho sakte hain aur updates lose ho sakte hain.
"lock-free" define karo.
Ek operation jo OS mutex acquire kiye bina bounded steps mein complete ho jaata hai, usually ek CPU instruction ke zariye (LOCK XADD / CMPXCHG).
compare_exchange_strong(expected, desired) kya karta hai?
Atomically: agar value==expected toh use desired set karo aur true return karo; warna current value ko expected mein load karo aur false return karo.
Arbitrary RMW ke liye CAS loop kyun use karte hain?
Yeh tab hi write karta hai jab read ke baad se kisi ne value nahi badli; failure par refresh karta hai aur retry karta hai, lock-free progress deta hai.
compare_exchange_weak aur _strong mein kya farq hai?
weak spuriously fail ho sakta hai (sasta, loops ke andar use karo); strong spuriously fail nahi hoga (single non-looped checks ke liye use karo).
Kaunsa pairing ek synchronizes-with edge banata hai?
Ek thread mein ek release store jo doosre thread mein ek acquire load ke zariye observe kiya jaaye.
memory_order_relaxed kab appropriate hai?
Jab tumhe sirf atomicity chahiye (jaise ek counter) aur koi doosra variable is op ki ordering par depend nahi karta.
Trap: kya atomic<int> a ke liye a = a + 1 atomic hai?
Nahi — yeh ek alag atomic load phir atomic store hai; a.fetch_add(1) ya ++a use karo.
Compile time par lock-freedom kaise check karte hain?
std::atomic<T>::is_always_lock_free (ya runtime par is_lock_free()).
Agar unspecified ho toh default memory order kya hai?