Modern çok çekirdekli işlemcilerde memory ordering acquire release semantiği, paylaşılan belleğin tutarlı görünmesini sağlamak için gereken minimum garanti setidir. Bu semantiği anlamadan yazılan lock-free kod, derleyici ve CPU optimizasyonları nedeniyle beklenmedik davranışlar sergiler. C++11 ile standartlaşan bellek modeli altı sıralama türü tanımlar: **memory_order_relaxed:** Yalnızca atomik operasyonun kendisi garanti altındadır; başka okuma/yazma operasyonlarıyla sıralama yoktur. Sayaç artırımı gibi bağımsız operasyonlar için uygundur. **memory_order_acquire:** Bu operasyondan sonra gelen tüm okumalar, bu acquire öncesindeki herhangi bir release tarafından yazılan değerleri görür. Mutex lock semantiğiyle örtüşür. **memory_order_release:** Bu operasyondan önce gelen tüm yazmalar, eşleşen bir acquire tarafından görünür hale gelir. Mutex unlock semantiğiyle örtüşür. **memory_order_acq_rel:** Hem acquire hem release semantiğini birleştirir. Read-Modify-Write operasyonlarında (compare_exchange, fetch_add) kullanılır. **memory_order_seq_cst:** Tüm thread'ler arasında tek bir toplam sıra (total order) garantisi verir. En güçlü, en maliyetli. C++'da varsayılan memory ordering budur. Memory ordering acquire release ile kurulan klasik producer-consumer örüntüsü: ```cpp std::atomic<bool> ready{false}; int data = 0; // Producer thread: data = 42; // (1) ready.store(true, memory_order_release); // (2) // Consumer thread: while (!ready.load(memory_order_acquire)); // (3) assert(data == 42); // (4), güvenli ``` (2) release, (3) acquire ile senkronize olduğunda, (1)'deki yazma (4)'te görünür garanti altındadır. Relaxed kullanıldığında bu garanti yoktur. **Sequentially Consistent:** seq_cst, tüm atomik operasyonların global bir sırayla gerçekleştiğini garanti eder. x86'da seq_cst store için `MFENCE` veya `LOCK XCHG` talimatı eklenir; ARM ve POWER gibi zayıf bellek modellerinde bu fark daha maliyetlidir. X86 mimarisinde TSO (Total Store Order) modeli, acquire/release'i ucuza sunar; seq_cst ise ek bariyer maliyeti gerektirir. ARM'de ise acquire = `LDAR`, release = `STLR` talimatlarına karşılık gelir. Hata yapılma riski yüksek bölgeler: - `compare_exchange_weak` başarısız kolunda `memory_order_relaxed` kullanmak güvenlidir çünkü yazma gerçekleşmez. - Bir thread'in yalnızca okuma yaptığı senaryolarda `acquire` yeterlidir; `seq_cst` gereksizdir. - `fetch_add` ile sayaç tutarken `relaxed` yeterlidir; ancak bu sayacın sonucu başka bir değerin görünürlüğüne koşul oluyorsa en az `release` gereklidir. Pratik öneri: lock-free kod yazarken önce `seq_cst` ile doğruluk sağlayın, ardından profilleme sonucuna göre zayıflatın.