Swift 创建初始值为0的信号量会导致执行问题
我在学习GCD,有个关于信号量的问题。 这是我的密码:Swift 创建初始值为0的信号量会导致执行问题,swift,grand-central-dispatch,semaphore,Swift,Grand Central Dispatch,Semaphore,我在学习GCD,有个关于信号量的问题。 这是我的密码: class ViewController: UIViewController { var semaphore: dispatch_semaphore_t! = nil override func viewDidLoad() { super.viewDidLoad() semaphore = dispatch_semaphore_create(0) dispatch_async(dispatch_
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)
}
如果我运行这段代码,那么控制台中不会打印来自信号量任务的任何内容,但是如果我更改
semaphore = dispatch_semaphore_create(0)
到
一切开始都很顺利
问题是为什么我应该写dispatch\u semaphore\u create(1)而不是0
谢谢大家! 您可以用两种不同的方式使用信号量:
信号。消费者调用wait
等待预期的项目/资源
等待,如果资源可用,则允许他们继续。如果没有,它们将被阻止。当每个人都使用完资源后,他们调用信号
因此,您所看到的是预期的,因为您正在将信号量设置为就绪标志,但将其用作访问限制(因为您首先调用
wait
。所以我更正了代码,向您展示了我是如何修复它的(感谢@Wain)
非常感谢。我明白了。所以如果我把0放进去,它想执行一些东西,但我说等待,它就等待。那是我的错误。再次感谢你!考虑打印正在运行的线程>代码> SimaPraceTebug ,这样您就可以看到它是主线程还是后台线程,并确认主线程等待后台线程完成。
semaphore = dispatch_semaphore_create(1)
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()
}
dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
semaphoreTask()
}
func semaphoreTask() {
print(semaphore.debugDescription)
for i in 0...1000 {
print(i)
if i == 1000 {
print("i is equal to 10000!")
}
}
dispatch_semaphore_signal(self.semaphore)
}
}