Sobes.tech
Middle

Proqramlaşdırma kontekstində semafor nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Semafor, çox iplikli proqramların sinxronizasiyası üçün primitivdir və məhdud resursa girişə nəzarət edir. Bu, tam ədəd sayğacı saxlayır.

Əsas əməliyyatlar:

  • wait() (və ya P / acquire) : Sayğacı 1 azaldır. Əgər sayğac mənfi olarsa, digər iplik signal()-ı yerinə yetirənə qədər bloklanır.
  • signal() (və ya V / release) : Sayğacı 1 artırır. Əgər bloklanmış ipliklər varsa, onlardan biri açılır.

Semaforların növləri:

  • İkili semafor (mutex) : Sayğac 0 və ya 1 dəyərini qəbul edir. Yalnız bir iplik resursa eyni vaxtda daxil ola bilər.
  • Sayğaclı semafor : Sayğac 0-dan N-ə qədər dəyərlər ala bilər. Məhdud sayda elementlərlə resurs hovuzuna girişin idarə olunması üçün istifadə olunur.

Swift-də eyni vaxtda işləyən tapşırıqların sayını məhdudlaşdırmaq üçün nümunə:

// 3-ə qədər eyni vaxtda girişə icazə verən semafor yaradılır
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Tapşırıq 1
    semaphore.wait() // Sayğacı azaldır, əgər 3-dən çox tapşırıq işləyirsə, gözləyir
    print("Tapşırıq 1 başladı")
    Thread.sleep(forTimeInterval: 2) // İşin simulyasiyası
    print("Tapşırıq 1 tamamlandı")
    semaphore.signal() // Sayğacı artırır, gözləyən tapşırıqları azad edir
}

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

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

DispatchQueue.global().async {
    // Tapşırıq 4 (gözləyəcək, yer boşaldıqda)
    semaphore.wait()
    print("Tapşırıq 4 başladı")
    Thread.sleep(forTimeInterval: 2)
    print("Tapşırıq 4 tamamlandı")
    semaphore.signal()
}

// Bütün tapşırıqların tamamlanmasını gözləyin
// Əsl kodda daha etibarlı gözləmə mexanizmlərindən istifadə edin
Thread.sleep(forTimeInterval: 5)