objective-c - dispatch_sync 调用变成 dispatch_async 调用

标签 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_sync 更改为 dispatch_async 它会按预期工作,dispatch_sync 进入 dispatch_async 调用是否会产生此类问题?

回答后编辑----------------

这种情况会造成死锁:

您可以查看已接受的答案以获得对这种情况的解释,并查看此链接以获取文档 http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man3/dispatch_async.3.html

最佳答案

这是一个僵局。

dispatch_sync 调用将等待 queue 可用,然后运行其 block 并返回,但直到 dispatch_async 才可用已经完成,所以它会坐在那里旋转等待调用 dispatch_sync

关于objective-c - dispatch_sync 调用变成 dispatch_async 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8668585/

相关文章:

objective-c:在 UIImage 或 UIImageView 上画线

ios - LinkedIn 框架仍然不包含位码

ios - 如何在 UICollectionView 上添加 UIView 并使用单元格滚动?

swift - Swift 中的 dispatch after 示例

ios - 使用 GCD 加载数据非常慢

objective-c - 如何防止子进程在停靠栏中弹跳?

c++ - 使用了自动释放但仍然泄漏

带有 completionBlock 的 IOS Objective-C 写函数

iOS TableView 如何访问自定义单元格变量

ios - 我可以在 semaphore.wait() 主线程上调用吗?