Section 2/102 menit

2. Teori: Mutual Exclusion dan Memory Ordering

2. Teori: Mutual Exclusion dan Memory Ordering

Mutual Exclusion (Mutex)

Mutex (Mutual Exclusion) adalah primitive synchronization yang menjamin hanya satu thread yang bisa mengeksekusi critical section pada satu waktu.

swift
Thread A: lock() → critical section → unlock()
Thread B:          [blocked]       →  lock() → critical section → unlock()

Properti utama mutex yang benar:

  1. Safety: Hanya satu thread dalam critical section pada satu waktu
  2. Liveness: Thread yang menunggu akhirnya akan mendapatkan lock
  3. No starvation: Tidak ada thread yang menunggu selamanya

Masalah klasik dengan mutex:

  • Deadlock: Thread A menunggu Thread B, Thread B menunggu Thread A
  • Priority inversion: Thread prioritas tinggi menunggu thread prioritas rendah yang memegang lock
  • Livelock: Thread terus bergerak tapi tidak ada kemajuan

Swift's Mutex<Value> mengikat data langsung ke mutex-nya — ini mencegah akses tanpa lock karena data hanya bisa diakses melalui withLock.

Atomic Operations

Atomik berarti operasi terjadi sebagai satu unit yang tidak bisa dipotong oleh thread lain. Bayangkan ini seperti "transaksi yang tidak bisa di-interrupt":

swift
Thread A: read-modify-write counter (atomic)
Thread B:                              [harus tunggu operasi A selesai]

Atomic operations diimplementasikan menggunakan instruksi CPU khusus:

  • CAS (Compare-and-Swap): "Ganti nilai ini dari X ke Y, tapi hanya jika masih X"
  • Fetch-and-Add: "Tambah nilai ini dan kembalikan nilai lama, secara atomik"
  • Load/Store: "Baca/tulis dengan jaminan atomisitas"

Atomic jauh lebih cepat dari mutex untuk operasi sederhana karena:

  • Tidak ada OS syscall (mutex mungkin masuk ke kernel)
  • Tidak ada thread blocking
  • Diimplementasikan langsung sebagai instruksi CPU

Tapi atomic hanya cocok untuk tipe sederhana (Int, Bool, pointer) dan operasi tunggal. Untuk operasi yang melibatkan banyak variabel atau logika kompleks, kamu butuh mutex.