dispatch_sync调用dispatch_async调用

Mat*_*oal 7 objective-c grand-central-dispatch ios

我对这段代码的行为有些怀疑:

dispatch_async(queue, ^{
    sleep(2);
    NSLog(@"step1");

    dispatch_sync(queue, ^{
        sleep(3);
        NSLog(@"step 2");
    });

    NSLog(@"step 3");
});
Run Code Online (Sandbox Code Playgroud)

从这些行我希望得到输出,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

mat*_*way 21

那是一个僵局.

在完成阻止并返回之前,dispatch_sync呼叫将一直等到queue可用,但是在dispatch_async完成之前它将无法使用,因此只会坐在那里等待呼叫dispatch_sync.