Sobes.tech
Middle

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.