Semafor va mutex o'rtasidagi farq nima?
sobes.tech AI
AIdan javob
Semafor — bu umumiy sinxronlash mexanizmi bo‘lib, u bir nechta raqobat qiluvchi oqimlar tomonidan cheklangan resursga kirishni boshqarish uchun ishlatiladi. U butun son qiymatini saqlaydi, bu resursni egallashda kamayadi va bo‘shatishda oshadi. Agar semafor qiymati nolga teng bo‘lsa, uni egallash urinish oqimni bloklaydi, boshqa oqim resursni bo‘shatguniga qadar. Bu bir vaqtning o‘zida ishlayotgan oqimlar sonini cheklash uchun ishlatilishi mumkin.
Mutex (mutual exclusion — o‘zaro chiqarish) — bu binar semafor bo‘lib, u yoki bloklangan yoki blokdan chiqarilgan holatda bo‘lishi mumkin. U kodning kritik bo‘limlarini bir vaqtning o‘zida bir nechta oqimlar kirishidan himoya qilish uchun ishlatiladi. Faqat bitta oqim mutexni egallashi mumkin. Mutexni egallagan oqim, uni egallashga uringan boshqa oqim tomonidan to‘xtatilmaydi. Agar bloklangan mutexni egallashga urinish bo‘lsa, oqim uning bo‘shatilguniga qadar bloklanadi.
Asosiy farqlar:
| Xususiyat | Semafor | Mutex |
|---|---|---|
| Turi | Umumiy sinxronlash mexanizmi | Binar semafor (semaforning maxsus holati) |
| Qiymat | Butun son (>= 0) | Binar (0 yoki 1) |
| Maqsad | Resurslarga kirishni boshqarish, oqimlar sonini cheklash | Kritik bo‘limlarni himoya qilish, o‘zaro chiqarish |
| Egasi | Egasi bo‘lishi shart emas | Doimo egasi bo‘ladi (uni egallagan oqim) |
| iOSda foydalanish | DispatchSemaphore |
Ko‘pincha DispatchQueue.sync yoki NSRecursiveLock orqali amalga oshiriladi |
Kritik bo‘limni himoya qilish uchun mutexdan foydalanish misoli:
// GCD (Grand Central Dispatch) kontekstida
let serialQueue = DispatchQueue(label: "com.example.criticalSection")
serialQueue.sync {
// Kritik bo‘lim kodi
// Faqat bitta oqim bu yerda bo‘lishi mumkin
}
Paralel vazifalarni cheklash uchun semafor misoli:
// GCD (Grand Central Dispatch) kontekstida
let semaphore = DispatchSemaphore(value: 3) // 3 ta parallel vazifaga ruxsat beradi
DispatchQueue.global().async {
semaphore.wait() // Semafor qiymatini 1 ga kamaytiradi. Qiymat 0 bo‘lsa, bloklaydi.
// Parallel vazifa kodi
print("Vazifa bajarilmoqda")
Thread.sleep(forTimeInterval: 1) // Ishni simulyatsiya qilish
semaphore.signal() // Semafor qiymatini 1 ga oshiradi. Kutayotgan oqinni ochadi, agar bo‘lsa.
print("Vazifa yakunlandi")
}
// Bunday bloklarni bir nechta ishga tushirish mumkin. Faqat 3 tasi bir vaqtning o‘zida bajariladi.