【问题标题】: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 工作的“回调”块很有用。

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

【问题讨论】:

    标签: iphone ios concurrency grand-central-dispatch


    【解决方案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】:

        全局调度队列:

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

        主调度队列:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-11-10
          • 2015-07-25
          • 1970-01-01
          • 2010-10-26
          • 1970-01-01
          • 1970-01-01
          • 2012-03-09
          • 2017-02-09
          相关资源
          最近更新 更多