Блокирует ли DispatchSemaphore на основе QOS весь пул потоков

let semaphore = DispatchSemaphore(value: 1) 
DispatchQueue.global(qos: .background)

Означает ли это, что если я использую этот семафор, чтобы сделать конкретный блок ресурса доступным только для одного потока за раз, он будет блокировать все потоки, работающие в фоновом режиме (или) только блокирует потоки, требующие ресурсов

2 ответа

Решение

Он будет блокировать только те потоки, которым требуются уже выделенные ресурсы. Всякий раз, когда поток вызывает,

@discardableResult func signal() -> Int 

счетчик семафоров увеличивается на 1, и этому потоку предоставляется доступ к критической секции. Если следующий поток вызывает тот же метод, он будет заблокирован до тех пор, пока не вызовет первый поток.

func wait()

метод.

Семафоры - это просто менеджеры, которые управляют выполнением потоков, которые вы их просите. Итак, если вы не вызываете семафор в конкретном потоке, поток не имеет ничего общего с семафором. Так что вам не нужно беспокоиться о блокировке других потоков

Если семафор занят, следующий поток устанавливается на wait() и поэтому замораживается, пока не получит signal(). Следовательно, просто не связывайтесь с основным потоком:-)

Другие вопросы по тегам