Sobes.tech
Middle

Dasturlash kontekstida semafor nima?

sobes.tech AI

AIdan javob

Semafor — bu cheklovchi oqimlarni sinxronlashtirish uchun primitive bo‘lib, cheklangan resursga kirishni boshqaradi. U butun sonli hisoblagichni saqlaydi.

Asosiy operatsiyalar:

  • wait() (yoki P / acquire) : hisoblagichni 1 ga kamaytiradi. Agar hisoblagich manfiy bo‘lsa, oqim signal() bajarilguncha bloklanadi.
  • signal() (yoki V / release) : hisoblagichni 1 ga oshiradi. Agar bloklangan oqimlar bo‘lsa, ulardan biri ochiladi.

Semafor turlari:

  • Binary semafor (mutex) : hisoblagich 0 yoki 1 qiymatlarni oladi. Bir vaqtning o‘zida faqat bitta oqim resursga kirishi uchun ishlatiladi.
  • Hisoblovchi semafor : hisoblagich 0 dan N gacha qiymat olishi mumkin. Cheklangan elementlar bilan resurslar havzasiga kirishni boshqarish uchun ishlatiladi.

Swiftda bir vaqtning o‘zida bajariladigan vazifalar sonini cheklash uchun misol:

// 3 ta bir vaqtning o‘zida kirishga ruxsat beradigan semafor yaratish
let semaphore = DispatchSemaphore(value: 3)

DispatchQueue.global().async {
    // Vazifa 1
    semaphore.wait() // Hisoblagichni kamaytiradi, agar 3 dan ortiq vazifa ishlayotgan bo‘lsa, kutadi
    print("Vazifa 1 boshlanmoqda")
    Thread.sleep(forTimeInterval: 2) // Ishni simulyatsiya qilish
    print("Vazifa 1 tugadi")
    semaphore.signal() // Hisoblagichni oshiradi, kutayotgan vazifalarni ochadi
}

DispatchQueue.global().async {
    // Vazifa 2
    semaphore.wait()
    print("Vazifa 2 boshlanmoqda")
    Thread.sleep(forTimeInterval: 3)
    print("Vazifa 2 tugadi")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Vazifa 3
    semaphore.wait()
    print("Vazifa 3 boshlanmoqda")
    Thread.sleep(forTimeInterval: 1)
    print("Vazifa 3 tugadi")
    semaphore.signal()
}

DispatchQueue.global().async {
    // Vazifa 4 (kutadi, joy bo‘shashini)
    semaphore.wait()
    print("Vazifa 4 boshlanmoqda")
    Thread.sleep(forTimeInterval: 2)
    print("Vazifa 4 tugadi")
    semaphore.signal()
}

// Barcha vazifalar tugashini kutish uchun
// Haqiqiy kodda ishonchliroq kutish mexanizmlaridan foydalaning
Thread.sleep(forTimeInterval: 5)