Фарқи байни семафор ва мютекс чист?
sobes.tech AI
Ҷавоб аз AI
Семафор — бұл жалпы синхрондау механизмі, ол бірнеше бәсекелес ағындар арасында шектеулі ресурстарға қол жеткізуді басқару үшін пайдаланылады. Ол бүтін санды мәнді ұстайды, ол ресурс алғанда азаяды және босатқанда көбейеді. Егер семафордың мәні нөлге тең болса, оны алу әрекеті басқа ағын ресурс босатқанша тоқтайды. Ол бір уақытта жұмыс істеп жатқан ағындардың санын шектеу үшін қолданылуы мүмкін.
Мьютекс (өзара шығару — өзара айыру) — бұл бинарлы семафор, ол немесе бұғатталған немесе босатылған күйде болуы мүмкін. Ол бірнеше ағынның бір уақытта қол жеткізуінен қорғаныс үшін пайдаланылады. Тек бір ағын мьютексті алу мүмкін. Мьютексті алған ағын басқа ағын оны алуға тырысқанда үзіліссіз қалады. Егер бұғатталған мьютексті алуға тырысса, ағын оның босатылуын күтеді.
Негізгі айырмашылықтар:
| Ерекшелігі | Семафор | Мьютекс |
|---|---|---|
| Түрі | Жалпы синхрондау механизмі | Бинарлы семафор (семафордың арнайы жағдайы) |
| Мәні | Целочисленное (>= 0) | Бинарлы (0 немесе 1) |
| Мақсаты | Ресурстарға қол жеткізуді басқару, шектеу | Критикалық бөлімдерді қорғау, өзара шығару |
| Иесі | Иесі болмауы мүмкін | Әрқашан иесі бар (оны алған ағын) |
| iOS-те қолданылуы | DispatchSemaphore |
Көп жағдайда DispatchQueue.sync немесе NSRecursiveLock арқылы жүзеге асырылады |
Мьютексті пайдалану мысалы, критикалық бөлімді қорғау үшін:
// GCD (Grand Central Dispatch) контекстінде
let serialQueue = DispatchQueue(label: "com.example.criticalSection")
serialQueue.sync {
// Критикалық бөлім коды
// Тек бір ағын ғана мұнда бола алады
}
Параллель тапсырмаларды шектеу үшін семафорды пайдалану мысалы:
// GCD (Grand Central Dispatch) контекстінде
let semaphore = DispatchSemaphore(value: 3) // 3 параллель тапсырмаға рұқсат береді
DispatchQueue.global().async {
semaphore.wait() // Семaфор мәнін 1-ге азайтады. Егер мән 0 болса, тоқтайды.
// Параллель орындалатын тапсырма коды
print("Тапсырма орындалуда")
Thread.sleep(forTimeInterval: 1) // Жұмысты имитациялау
semaphore.signal() // Семaфор мәнін 1-ге арттырады. Күтіп тұрған ағынды босатады, егер бар болса.
print("Тапсырма аяқталды")
}
// Мұндай бірнеше блокты іске қосуға болады. Тек 3 бір уақытта орындалады.