Semafor və mutex arasındakı fərq nədir?
sobes.tech Süni İntellekt
AI-dan cavab
Semafor ümumi sinxronizasiya mexanizmi olub, çoxsaylı mübarizə aparan axınlar tərəfindən məhdudlaşdırılmış resurslara girişin idarə olunması üçün istifadə olunur. O, giriş zamanı azaldılan və sərbəst buraxıldıqda artırılan tam ədəd dəyər saxlayır. Əgər semaforun dəyəri sıfırdırsa, onu ələ keçirməyə cəhd edən axın, başqa bir axın resursu sərbəst buraxana qədər bloklanır. Bu, eyni zamanda işləyən axınların sayını məhdudlaşdırmaq üçün istifadə edilə bilər.
Mutex (qarşılıqlı istisna) ikili semafordur və ya bloklanmış və ya blokdan çıxarılmış vəziyyətdə ola bilər. Bu, kodun kritik bölmələrini çoxsaylı axınların eyni vaxtda girişindən qorumaq üçün istifadə olunur. Yalnız bir axın mutex-i ələ keçirə bilər. Mutex-i ələ keçirmiş axın, onu almağa çalışan digər axın tərəfindən kəsilə bilməz. Əgər bloklanmış mutex-i ələ keçirməyə cəhd edilərsə, axın onun sərbəst buraxılana qədər bloklanır.
Əsas fərqlər:
| Xüsusiyyət | Semafor | Mutex |
|---|---|---|
| Növ | Ümumi sinxronizasiya mexanizmi | Ikili semafor (semaforun xüsusi halı) |
| Dəyər | Tam ədəd (>= 0) | Ikili (0 və ya 1) |
| Təyinat | Resurslara girişin idarə olunması, axınların sayı ilə məhdudlaşdırılması | Kritik bölmələrin qorunması, qarşılıqlı istisna |
| Sahibi | Sahibi olmaya bilər | Həmişə sahibi var (onu ələ keçirən axın) |
| iOS-də istifadə | DispatchSemaphore |
Tez-tez DispatchQueue.sync və ya NSRecursiveLock vasitəsilə həyata keçirilir |
Kritik bölməni qorumaq üçün mutex istifadəsi nümunəsi:
// GCD (Grand Central Dispatch) kontekstində
let serialQueue = DispatchQueue(label: "com.example.criticalSection")
serialQueue.sync {
// Kritik kod bölməsi
// Yalnız bir axın burada ola bilər
}
Paralel tapşırıqları məhdudlaşdırmaq üçün semafor nümunəsi:
// GCD (Grand Central Dispatch) kontekstində
let semaphore = DispatchSemaphore(value: 3) // 3 paralel tapşırığa icazə verir
DispatchQueue.global().async {
semaphore.wait() // Semafor dəyərini 1 azaldır. Dəyər 0 olarsa, bloklayır.
// Paralel tapşırıq kodu
print("Tapşırıq icra olunur")
Thread.sleep(forTimeInterval: 1) // İşin simulyasiyası
semaphore.signal() // Semafor dəyərini 1 artırır. Gözləyən axını açır, varsa.
print("Tapşırıq tamamlandı")
}
// Belə bloklar çox qala bilər. Yalnız 3-ü eyni vaxtda işləyəcək.