Sobes.tech
Middle

Programlama bağlamında semafor nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Semafor, sınırlı bir kaynağa erişimi yöneten iş parçacığı senkronizasyonu için temel bir araçtır. Tam sayı sayacı tutar.

Ana işlemler:

  • wait() (veya P / al) : Sayacı 1 azaltır. Sayı negatif hale gelirse, diğer iş parçacığı signal() yapana kadar engellenir.
  • signal() (veya V / serbest bırak) : Sayacı 1 artırır. Engellenmiş iş parçacıkları varsa, biri serbest bırakılır.

Semafor türleri:

  • İkili semafor (mutex) : Sayaç 0 veya 1 alır. Sadece bir iş parçacığının kaynağa aynı anda erişmesini sağlar.
  • Sayısal semafor : Sayaç 0 ile N arasında değer alabilir. Sınırlı sayıda erişilebilir öğeye sahip kaynak havuzuna erişimi yönetmek için kullanılır.

Swift'te aynı anda çalışan görevlerin sayısını sınırlamak için örnek:

// En fazla 3 eşzamanlı erişime izin veren semafor oluşturma
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Görev 1
    semaphore.wait() // Sayacı azaltır, 3'ten fazla görev çalışıyorsa bekler
    print("Görev 1 başladı")
    Thread.sleep(forTimeInterval: 2) // Çalışmayı taklit eder
    print("Görev 1 tamamlandı")
    semaphore.signal() // Sayacı artırır, bekleyen görevleri serbest bırakır
}

DispatchQueue.global().async {
    // Görev 2
    semaphore.wait()
    print("Görev 2 başladı")
    Thread.sleep(forTimeInterval: 3)
    print("Görev 2 tamamlandı")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Görev 3
    semaphore.wait()
    print("Görev 3 başladı")
    Thread.sleep(forTimeInterval: 1)
    print("Görev 3 tamamlandı")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Görev 4 (bir yer boşalana kadar bekleyecek)
    semaphore.wait()
    print("Görev 4 başladı")
    Thread.sleep(forTimeInterval: 2)
    print("Görev 4 tamamlandı")
    semaphore.signal()
}

// Tüm görevlerin tamamlanmasını bekle (demo amaçlı)
// Gerçek kodda daha güvenilir bekleme mekanizmaları kullanın
Thread.sleep(forTimeInterval: 5)