dispatch_sync调用dispatch_async调用

时间:2011-12-29 13:42:19

标签: objective-c ios grand-central-dispatch

我对此代码的行为有疑问:

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

2 个答案:

答案 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”)。它在递归锁的上下文中讨论,但原理是相同的。