首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将dispatch_sync调用转换为dispatch_async调用

将dispatch_sync调用转换为dispatch_async调用
EN

Stack Overflow用户
提问于 2011-12-29 13:42:19
回答 2查看 4.4K关注 0票数 7

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

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-29 13:44:23

这是个僵局。

在运行其块并返回之前,dispatch_sync调用将一直等到queue可用,但在dispatch_async完成之前这是不可用的,因此它将坐在那里,旋转等待调用dispatch_sync

票数 21
EN

Stack Overflow用户

发布于 2011-12-29 14:16:51

正如@mattjgalloway所提到的,这是一个死锁。

苹果自己的文档在这里提到了这个问题:http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html (参见“递归锁”)。它是在递归锁的上下文中讨论的,但是原理是相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8668585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档