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

这是否意味着如果我使用这个信号量来使一个特定的资源块一次只能由一个线程访问,它将阻塞在后台运行的整个线程(或)只阻塞需要资源的线程

4

2 回答 2

2

它只会阻塞需要已分配资源的线程。每当一个线程调用时,

@discardableResult func signal() -> Int 

信号量计数增加 1,并且该线程被授予访问临界区的权限。如果即将到来的线程调用相同的方法,它将被阻塞,直到第一个线程调用

func wait()

方法。

于 2019-09-17T12:49:57.860 回答
2

信号量只是管理您要求它们执行的线程的管理器。因此,除非您在特定线程上调用信号量,否则该线程与信号量无关。所以你不必担心其他线程被阻塞

如果信号量被占用,则下一个线程被设置为wait()并因此被冻结,直到它获得signal(). 因此,只是不要弄乱主线程:-)

于 2019-09-17T13:01:21.240 回答