我对这个代码的行为有些怀疑:
dispatch_async(queue, ^{
sleep(2);
NSLog(@"step1");
dispatch_sync(queue, ^{
sleep(3);
NSLog(@"step 2");
});
NSLog(@"step 3");
});从这些行中,我希望得到输出step1 -> step3 -> step2,但我只获得了step1。
如果我用dispatch_sync和dispatch_async进行更改,那么dispatch_sync转换为dispatch_async调用是否会产生这种问题呢?
答案后编辑
这种情况会造成死锁:
您可以检查已接受的答案以获得对此情况的解释,并检查此链接以获得文档http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html
发布于 2011-12-29 13:44:23
这是个僵局。
在运行其块并返回之前,dispatch_sync调用将一直等到queue可用,但在dispatch_async完成之前这是不可用的,因此它将坐在那里,旋转等待调用dispatch_sync。
发布于 2011-12-29 14:16:51
正如@mattjgalloway所提到的,这是一个死锁。
苹果自己的文档在这里提到了这个问题:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html (参见“递归锁”)。它是在递归锁的上下文中讨论的,但是原理是相同的。
https://stackoverflow.com/questions/8668585
复制相似问题