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ə yaP/acquire) : Sayğacı 1 azaldır. Əgər sayğac mənfi olarsa, digər ipliksignal()-ı yerinə yetirənə qədər bloklanır.signal()(və yaV/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)