Sobes.tech
Middle

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.