【发布时间】:2020-01-18 07:56:30
【问题描述】:
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global(qos: .background)
这是否意味着如果我使用这个信号量来使一个特定的资源块一次只能由一个线程访问,它将阻塞在后台运行的整个线程(或)只阻塞需要资源的线程
【问题讨论】:
标签: swift qos dispatchsemaphore
let semaphore = DispatchSemaphore(value: 1)
DispatchQueue.global(qos: .background)
这是否意味着如果我使用这个信号量来使一个特定的资源块一次只能由一个线程访问,它将阻塞在后台运行的整个线程(或)只阻塞需要资源的线程
【问题讨论】:
标签: swift qos dispatchsemaphore
它只会阻塞需要已分配资源的线程。每当一个线程调用时,
@discardableResult func signal() -> Int
信号量计数增加 1,并且该线程被授予对临界区的访问权限。如果即将到来的线程调用相同的方法,它将被阻塞,直到第一个线程调用
func wait()
方法。
【讨论】:
信号量只是管理您请求它们执行的线程的管理器。因此,除非您在特定线程上调用信号量,否则该线程与信号量无关。所以你不必担心其他线程会被阻塞
如果信号量被占用,下一个线程被设置为wait(),因此被冻结直到它得到signal()。因此,不要乱搞主线程 :-)
【讨论】: