GCD异步与同步任务执行顺序分析

GCD异步与同步任务执行顺序分析

在iOS开发中,理解GCD(Grand Central Dispatch)任务的执行顺序对编写高效和安全的多线程代码至关重要。本文将通过一段代码示例,分析在主线程和非主线程上执行异步和同步任务时的输出顺序。

示例代码

以下是一段使用GCD的示例代码:

- (void)run {
    dispatch_queue_t worker_queue = dispatch_queue_create("worker", DISPATCH_QUEUE_SERIAL);
    NSLog(@"0");
    
    dispatch_async(worker_queue, ^{
        NSLog(@"1");
    });
    
    dispatch_async(worker_queue, ^{
        NSLog(@"2");
    });
    
    dispatch_sync(worker_queue, ^{
        NSLog(@"3");
        dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"4");
        });
    });
    
    NSLog(@"5");
    
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"6");
    });
}

在主线程上运行

  1. 在主线程上运行时,dispatch_sync 调用会阻塞主线程,直到“同步任务”完成,而此处的“同步任务”又是串行队列的最后添加的一个任务,所以要等到前面的任务完成,分析到此处,可以确定如下输出顺序:
0
1
2
3
  1. 46 的输出先后顺序是一定的,4 一定在 6 的前面输出,因为 main_queue 是一个串行队列,那么 5 与 “4,6”的顺序是怎样的呢 ?这取决于到底是谁先入队的,是 NSLog(@"5"); 先入队,还是 NSLog(@"4");。答案是 NSLog(@"5"); 先入队,因为 - (void)run { } 是作为一个整体先入队的,当执行如下代码时,NSLog(@"5"); 已经在 main_queue 中:

    dispatch_async(dispatch_get_main_queue(), ^{
            NSLog(@"4");
        });
    
  2. 所以最终的输出顺序如下:

0
1
2
3
5
4
6

在非主线程上运行

  1. 在非主线程上运行时,dispatch_sync 不会阻塞主线程,但会阻塞当前的非主线程。同上面在主线程上执行一样的道理,首先可以确定 0, 1, 2, 3 最先执行,并且 4 在 6 之前执行。
  2. 由于 dispatch_async 将任务提交给主线程队列,而主线程处理这些任务的时机具体不确定性,具体取决于主线程的调度,所以输出 5 可能在 4 和 6 的前面,后面,中间。
  3. 可能的输出结果如下:
0
1
2
3
5
4
6
0
1
2
3
4
5
6
0
1
2
3
4
6
5

相关推荐

  1. GCD异步同步任务执行顺序分析

    2024-07-23 08:00:04       23 阅读
  2. 同步异步

    2024-07-23 08:00:04       36 阅读
  3. django的gunicorn的异步任务执行

    2024-07-23 08:00:04       63 阅读
  4. SQL书写顺序执行顺序

    2024-07-23 08:00:04       32 阅读
  5. ajax和同步异步

    2024-07-23 08:00:04       39 阅读
  6. 前端中的同步异步任务详细说明

    2024-07-23 08:00:04       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-23 08:00:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-23 08:00:04       101 阅读
  3. 在Django里面运行非项目文件

    2024-07-23 08:00:04       82 阅读
  4. Python语言-面向对象

    2024-07-23 08:00:04       92 阅读

热门阅读

  1. 设计模式-策略模式

    2024-07-23 08:00:04       25 阅读
  2. 深入解析Memcached:C#中的应用与实战案例

    2024-07-23 08:00:04       23 阅读
  3. Python subprocess.call - 将变量添加到 subprocess.call

    2024-07-23 08:00:04       23 阅读
  4. 释放分布式系统潜能:Mojo模型的集成与应用

    2024-07-23 08:00:04       25 阅读
  5. 精准控制构建流程:Gradle中onlyIf条件的高级应用

    2024-07-23 08:00:04       23 阅读
  6. github搜索指令

    2024-07-23 08:00:04       25 阅读
  7. Oracle(18)什么是序列(Sequence)?

    2024-07-23 08:00:04       23 阅读