Sobes.tech
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)