ios - 在当前队列上同步调度

标签 ios multithreading concurrency grand-central-dispatch

我知道您可能会觉得这是一个奇怪的问题,但我只是在学习 GCD,我想全面了解它的各个方面。所以这里是:

是否有任何理由在 CURRENT QUEUE 上调度任务 SYNC?

例如:

    dispatch_queue_t concurrentQueue = dispatch_get_global_queue(...);
    dispatch_async(concurrentQueue, ^{
       //this is work task 0

       //first do something here, then suddenly:

       dispatch_sync(concurrentQueue, ^{
               //work task 1
       });

       //continue work task 0
    });

我明白一件事:如果我使用串行队列而不是concurrentQueue,那么我会在该串行队列上遇到死锁,因为work task 1work task 0 完成之前无法启动(因为串行队列保证了执行顺序),同时 work task 0 无法继续其执行,因为它等待 SYNC dispath 函数返回(如果我错了,请纠正我,那会让我成为一个完全的菜鸟)。

那么回到最初的想法,上面的代码和相同的代码之间有什么区别吗?我只是简单地写了 work task 1 而不是调用 dispatch_sync 函数> 直接编码?

最佳答案

没有。我想不出在你已经在的同一个并发队列上 dispatch_sync 的理由。如果你这样做,GCD 将立即在同一个线程上内联调用你的 block ,就像你直接调用它一样。 (我检查过。)正如您所指出的,在串行队列上执行此操作会使您陷入僵局。

关于ios - 在当前队列上同步调度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19180661/

相关文章:

objective-c - iOS - 在 UINavigationController 上设置 UIToolBarItem

ios - 使用的是哪个手势识别器?

python - 如何在pyqt中同时运行两个不同的线程

java - 使循环多线程昂贵,Java

ios - Swift Json Tableview 滞后

iphone - @2x 和图像分辨率的混淆

.NET Thread.Sleep() 随机不精确

android - 异步任务工作流程

java - 我从基于 Java 的 AWS lambda 处理程序启动一个单独的线程,有时会完成,有时不会,为什么?如何保证线程完成?

go - 为什么我的 Golang channel 写入永远阻塞?