Sobes.tech
Middle

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.