Semafor ve mutex arasındaki fark nedir?
sobes.tech yapay zeka
AI'dan gelen yanıt
Semafor, sınırlı kaynağa erişimi kontrol etmek için kullanılan genelleştirilmiş bir senkronizasyon mekanizmasıdır. Kaynağa erişim sırasında değeri azaltılır ve serbest bırakıldığında artırılır. Semafor değeri sıfırsa, erişim girişimi, başka bir thread kaynağı serbest bırakana kadar thread'i engeller. Aynı anda çalışan thread sayısını sınırlamak için kullanılabilir.
Mutex (karşılıklı dışlama), durumu ya kilitli ya da kilitsiz olan ikili bir semafordur. Kritik kod bölümlerini, birden fazla thread'in eşzamanlı erişiminden korumak için kullanılır. Aynı anda yalnızca bir thread mutex'i edinebilir. Mutex'i edinen thread, başka bir thread'in onu almaya çalışmasıyla kesintiye uğrayamaz. Kilitli bir mutex alınmaya çalışılırsa, thread, serbest bırakılana kadar engellenir.
Ana farklar:
| Özellik | Semafor | Mutex |
|---|---|---|
| Tip | Genelleştirilmiş senkronizasyon mekanizması | İkili semafor (semaforun özel durumu) |
| Değer | Tamsayı (>= 0) | İkili (0 veya 1) |
| Amaç | Kaynaklara erişimi kontrol etme, thread sayısını sınırlama | Kritik bölümleri koruma, karşılıklı dışlama |
| Sahibi | Sahibi olmayabilir | Her zaman sahibi vardır (aldığı thread) |
| iOS'ta kullanım | DispatchSemaphore |
Sıklıkla DispatchQueue.sync veya NSRecursiveLock kullanılarak uygulanır |
Kritik bölgeyi korumak için mutex kullanımı örneği:
// GCD (Grand Central Dispatch) bağlamında
let serialQueue = DispatchQueue(label: "com.example.criticalSection")
serialQueue.sync {
// Kritik kod bölgesi
// Aynı anda yalnızca bir thread burada olabilir
}
Paralel görevleri sınırlamak için semafor kullanımı örneği:
// GCD (Grand Central Dispatch) bağlamında
let semaphore = DispatchSemaphore(value: 3) // 3 paralel göreve izin verir
DispatchQueue.global().async {
semaphore.wait() // Semafor değerini 1 azaltır. Değer 0 ise engeller.
// Paralel görev kodu
print("Görev çalışıyor")
Thread.sleep(forTimeInterval: 1) // İşleme simülasyonu
semaphore.signal() // Semafor değerini 1 artırır. Bekleyen thread'i serbest bırakır.
print("Görev tamamlandı")
}
// Birkaç blok başlatılabilir. Sadece 3'ü aynı anda çalışacaktır.