我对此代码的行为有疑问:
dispatch_async(queue, ^{
sleep(2);
NSLog(@"step1");
dispatch_sync(queue, ^{
sleep(3);
NSLog(@"step 2");
});
NSLog(@"step 3");
});
从这些行中我希望获得输出step1 -> step3 -> step2
,但我只获得step1
。
如果我用dispatch_async更改dispatch_sync它按预期工作,dispatch_sync是否会调度dispatch_async会产生这种问题?
在回答后编辑----------------
这种情况造成了死锁:
您可以查看已接受的答案以获得此情况的说明,并查看此链接以获取文档http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html
答案 0 :(得分:21)
这是一个僵局。
dispatch_sync
调用将等到queue
可用,然后再运行其阻止并返回但是在dispatch_async
完成之前将无法使用,因此它只会坐在那里旋转等着来电dispatch_sync
。
答案 1 :(得分:1)
如@mattjgalloway所述,这是一个僵局。
Apple自己的文档提到了这里的问题:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html(参见“RECURSIVE LOCKS”)。它在递归锁的上下文中讨论,但原理是相同的。