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()(yokiP/acquire) : hisoblagichni 1 ga kamaytiradi. Agar hisoblagich manfiy bo‘lsa, oqimsignal()bajarilguncha bloklanadi.signal()(yokiV/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)