GCD 中的“全局队列”和“主队列”有啥区别?

Posted

技术标签:

【中文标题】GCD 中的“全局队列”和“主队列”有啥区别?【英文标题】:What's the difference between the "global queue" and the "main queue" in GCD?GCD 中的“全局队列”和“主队列”有什么区别? 【发布时间】:2012-03-25 00:20:22 【问题描述】:

在其他一些方式中,有这两种方式来获取GCD中的队列:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

如果我没有完全错,“主队列”是在主线程上执行的,对执行 UI 工作的“回调”块很有用。

这是否意味着“全局队列”是在后台线程上运行的?

【问题讨论】:

【参考方案1】:

主队列确实像你说的那样在主线程上运行。

全局队列是并发队列,来自dispatch_get_global_queue的主页:

与主队列或分配的队列不同 dispatch_queue_create(),全局并发队列 一旦线程可用(“非 FIFO”完成顺序)就安排块。全球并发 队列代表三个优先级:

       •   DISPATCH_QUEUE_PRIORITY_HIGH
       •   DISPATCH_QUEUE_PRIORITY_DEFAULT
       •   DISPATCH_QUEUE_PRIORITY_LOW

提交到高优先级全局队列的块将在那些提交到 默认或低优先级全局队列。提交到低优先级全局队列的块只会被 如果默认或高优先级队列上没有待处理的块,则调用。

因此,它们是在可用时在后台线程上运行的队列。它们是“非先进先出”,因此无法保证订购。

【讨论】:

说全局队列是并发队列并且不能创建自己的并发队列(使用dispatch_queue_create 或其他)是否正确? 请参考“非 FIFO”?【参考方案2】:

5 个队列(4 个后台,1 个主)也都有不同的线程优先级(-[NSThread threadPriority]):

                            -main- : 0.758065
      DISPATCH_QUEUE_PRIORITY_HIGH : 0.532258
   DISPATCH_QUEUE_PRIORITY_DEFAULT : 0.500000
       DISPATCH_QUEUE_PRIORITY_LOW : 0.467742
DISPATCH_QUEUE_PRIORITY_BACKGROUND : 0.000000

(在第 4 代 iPod 和 MacBook Pro 上的模拟器上测试)

【讨论】:

【参考方案3】:

是的。你可以在设备上运行这样的代码来测试它:

dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
            NSLog(@"Block 1a");
            NSAssert(![NSThread isMainThread], @"Wrong thread!");
            NSLog(@"Block 1b");
        );
dispatch_async(
    dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^
            dispatch_async(dispatch_get_main_queue(), ^
                    NSLog(@"Block 2a");
                    NSAssert([NSThread isMainThread], @"Wrong thread!");
                    NSLog(@"Block 2b");
                );
        );

【讨论】:

【参考方案4】:

全局调度队列:

    并发队列中的任务同时执行 [后台线程] 任务仍按照添加到队列中的顺序启动

主调度队列:

    在应用程序的主线程上执行任务的可用串行队列 线。 通常在某些情况下从后台队列调用 后台处理已完成,用户界面需要 更新。

【讨论】:

以上是关于GCD 中的“全局队列”和“主队列”有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

深入理解 GCD

深入了解GCD

深入理解 GCD

Objective-C IOS多线程之GCD深入理解

ios多线程同步异步、串行并行队列、死锁

IOS 主队列,全局队列的关系