Middle
Семафор дар контексти барномаинависӣ чист?
sobes.tech AI
Ҷавоб аз AI
Семафор — гэта прадукт сінхранізацыі патокаў, які кіруе доступам да абмежаванага рэсурсу. Ён падтрымлівае цэласны лічыльнік.
Асноўныя аперацыі:
wait()(ціP/acquire): зменшае лічыльнік на 1. Калі лічыльнік становіцца адмоўным, паток блакуецца да таго часу, пакуль іншы паток не выканаеsignal().signal()(ціV/release): павялічвае лічыльнік на 1. Калі ёсць заблакаваныя патокі, адзін з іх разблакоўваецца.
Тыпы семафораў:
- Бінарны семафор (мьютэкс): Лічыльнік прымае значэнні 0 або 1. Выкарыстоўваецца для забеспячэння ўзаемнага выключэння — толькі адзін паток можа атрымаць доступ да рэсурсу адначасова.
- Лічыльны семафор: Лічыльнік можа прымаць значэнні ад 0 да N. Выкарыстоўваецца для кіравання доступам да пулу рэсурсаў з абмежаванай колькасцю даступных элементаў.
Прыклад выкарыстання на Swift для абмежавання колькасці адначасова працуючых задач:
// Стварэнне семафора, які дазваляе да 3 адначасовых доступаў
let semaphore = DispatchSemaphore(value: 3)
DispatchQueue.global().async {
// Задача 1
semaphore.wait() // Зменшвае лічыльнік, блакуе, калі > 3 задачы працуюць
print("Задача 1 пачалася")
Thread.sleep(forTimeInterval: 2) // Імітацыя працы
print("Задача 1 завершана")
semaphore.signal() // Павялічвае лічыльнік, разблакоўвае чакаючыя задачы
}
DispatchQueue.global().async {
// Задача 2
semaphore.wait()
print("Задача 2 пачалася")
Thread.sleep(forTimeInterval: 3)
print("Задача 2 завершана")
semaphore.signal()
}
DispatchQueue.global().async {
// Задача 3
semaphore.wait()
print("Задача 3 пачалася")
Thread.sleep(forTimeInterval: 1)
print("Задача 3 завершана")
semaphore.signal()
}
DispatchQueue.global().async {
// Задача 4 (будзе чакаць, пакуль не вызваліцца слот)
semaphore.wait()
print("Задача 4 пачалася")
Thread.sleep(forTimeInterval: 2)
print("Задача 4 завершана")
semaphore.signal()
}
// Чакаем завяршэння ўсіх задач для дэманстрацыі
// Выкарыстоўвайце ў рэальным кодзе больш надзейныя механізмы чакання
Thread.sleep(forTimeInterval: 5)