Section 5/101 menit

5. Memory Ordering — Teori Lengkap

5. Memory Ordering — Teori Lengkap

Ini adalah konsep paling kompleks dari atomic operations. Memory ordering menentukan bagaimana operasi atomic berinteraksi dengan operasi memori lain di sekitarnya.

Mengapa Memory Ordering Penting?

CPU modern melakukan optimasi agresif:

  • Out-of-order execution: CPU mengeksekusi instruksi tidak berurutan
  • Store buffering: Writes mungkin tidak langsung terlihat oleh CPU lain
  • Cache coherency: Setiap CPU punya cache sendiri

Tanpa ordering, operasi yang kamu tulis di kode mungkin tidak terlihat oleh thread lain dalam urutan yang kamu harapkan.

Hierarchy Memory Ordering (dari paling longgar ke paling ketat)

swift
// 1. .relaxed — hanya atomisitas, tidak ada ordering guarantees
// Paling cepat, paling sedikit jaminan
// Gunakan: counter statistik, flag yang tidak bergantung pada data lain
requestCount.add(1, ordering: .relaxed)

// 2. .acquiring — operasi ini "melihat" semua writes dari release sebelumnya
// Gunakan: saat membaca flag sebelum membaca data yang dilindungi flag tersebut
let isReady = flag.load(ordering: .acquiring)
if isReady {
    // Dijamin melihat semua data yang di-store sebelum flag di-set
    let data = sharedData  // aman dibaca
}

// 3. .releasing — semua operasi sebelumnya dijamin terlihat sebelum operasi ini
// Gunakan: saat menulis data, lalu set flag "data ready"
sharedData = preparedData   // tulis data dulu
flag.store(true, ordering: .releasing)  // set flag — dijamin setelah data ditulis

// 4. .acquiringAndReleasing — kombinasi acquiring dan releasing
// Gunakan: untuk operasi read-modify-write seperti compare-exchange
let (_, _) = flag.compareExchange(
    expected: false,
    desired: true,
    ordering: .acquiringAndReleasing
)

// 5. .sequentiallyConsistent — ordering paling kuat
// Semua thread melihat semua operasi dalam urutan yang sama
// Paling lambat, paling aman
// Gunakan: default jika tidak yakin, atau untuk correctness yang mutlak
flag.store(true, ordering: .sequentiallyConsistent)

Panduan Praktis Memory Ordering

swift
Sedang belajar / tidak yakin → .sequentiallyConsistent
Counter statistik (tidak ada dependensi data) → .relaxed
Publish data (write flag setelah write data) → .releasing
Consume data (read data setelah check flag) → .acquiring
Compare-and-swap untuk lock → .acquiringAndReleasing