我正在学习GCD,但对信号量有疑问。这是我的代码:
class ViewController: UIViewController {
var semaphore: dispatch_semaphore_t! = nil
override func viewDidLoad() {
super.viewDidLoad()
semaphore = dispatch_semaphore_create(0)
dispatch_async(dispatch_get_global_queue(QOS_CLASS_DEFAULT, 0)) {
print("Entering")
self.semaphoreTask()
print(self.semaphore.debugDescription)
}
semaphoreTask()
print(semaphore.debugDescription)
}
func semaphoreTask() {
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
for i in 0...1000 {
print(i)
if i == 1000 {
print("i is equal to 10000!")
}
}
dispatch_semaphore_signal(self.semaphore)
}
如果我运行此代码,则semaphoreTask中的任何内容都不会打印在控制台中,但是如果我更改
semaphore = dispatch_semaphore_create(0)
到
semaphore = dispatch_semaphore_create(1)
一切开始顺利。
问题是为什么我应该写dispatch_semaphore_create(1)而不是0?
谢谢!
您可以通过两种不同的方式使用信号量:
signal
在准备就绪时调用。消费者打电话wait
等待所需的物品/资源。wait
并且如果有资源,则允许他们继续。如果没有,它们将被阻止。当每个人都完成资源后,他们将调用signal
。因此,您看到的是预期的结果,因为您将信号量设置为就绪标志,但将其用作访问限制(因为您wait
先调用)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句