ChatGPT解决这个技术问题 Extra ChatGPT

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

在其他一些方法中,有以下两种方法可以在 GCD 中获取队列:

dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);

dispatch_get_main_queue();

如果我没有完全错,“主队列”正在主线程上执行,并且适用于执行 UI 工作的“回调”块。

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


V
Vandit Mehta

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

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

与使用 dispatch_queue_create() 分配的一个或多个主队列不同,全局并发队列在线程可用时立即调度阻塞(“非 FIFO”完成顺序)。全局并发队列代表三个优先级: • DISPATCH_QUEUE_PRIORITY_HIGH • DISPATCH_QUEUE_PRIORITY_DEFAULT • DISPATCH_QUEUE_PRIORITY_LOW 提交到高优先级全局队列的块将在提交到默认或低优先级全局队列的块之前被调用。只有在默认或高优先级队列上没有待处理的块时,才会调用提交到低优先级全局队列的块。

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


说全局队列是并发队列并且您不能创建自己的并发队列(使用 dispatch_queue_create 或其他东西)是否正确?
请参考“非先进先出”?
j
jjrscott

个队列(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

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


G
Grzegorz Adam Hankiewicz

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

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");
                });
        });

L
Lyju I Edwinson

全局调度队列:

并发队列中的任务并发执行【后台线程】任务仍然按照加入队列的顺序启动

主调度队列:

在应用程序的主线程上执行任务的可用串行队列。当一些后台处理完成并且需要更新用户界面时,它通常从后台队列中调用。