Блокирует ли DispatchSemaphore на основе QOS весь пул потоков
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global(qos: .background)
Означает ли это, что если я использую этот семафор, чтобы сделать конкретный блок ресурса доступным только для одного потока за раз, он будет блокировать все потоки, работающие в фоновом режиме (или) только блокирует потоки, требующие ресурсов
2 ответа
Он будет блокировать только те потоки, которым требуются уже выделенные ресурсы. Всякий раз, когда поток вызывает,
@discardableResult func signal() -> Int
счетчик семафоров увеличивается на 1, и этому потоку предоставляется доступ к критической секции. Если следующий поток вызывает тот же метод, он будет заблокирован до тех пор, пока не вызовет первый поток.
func wait()
метод.
Семафоры - это просто менеджеры, которые управляют выполнением потоков, которые вы их просите. Итак, если вы не вызываете семафор в конкретном потоке, поток не имеет ничего общего с семафором. Так что вам не нужно беспокоиться о блокировке других потоков
Если семафор занят, следующий поток устанавливается на wait()
и поэтому замораживается, пока не получит signal()
. Следовательно, просто не связывайтесь с основным потоком:-)