美文网首页
一段GCD函数执行过程的理解

一段GCD函数执行过程的理解

作者: 7hriller | 来源:发表于2018-09-16 20:04 被阅读20次
//在主线程执行
- (void)testGCD
{
  dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    });
    NSLog(@"4");
    while (1) {
        
    }
    NSLog(@"5");
}

问主线程执行testGCD后控制台打印的结果是什么?

dispatch_async(dispatch_get_global_queue(0, 0), ^{
        NSLog(@"1");
        dispatch_sync(dispatch_get_main_queue(), ^{
            NSLog(@"2");
        });
        NSLog(@"3");
    });

以上部分会异步将block任务提交到一个全局并行队列中,该任务我们记为async_task;同时主线程下面的代码可以称为main_task

NSLog(@"4");
    while (1) {
        
    }
    NSLog(@"5");

可以知道async_taskmain_task是并发执行的,因此执行结果可能有两种情况:先打印4后打印1或者相反(235下面讨论);

这时关注async_task里的dispatch_sync任务,我们记作sync_task

这个任务会同步提交到主队列等待执行,返回后才会打印3。

而在sync_task前面串行等待的任务还有main_task,也就是sync_task要等待main_task执行完才执行。

而这里的main_task包含一个while(1){}的死循环代码,因此永远执行不完,那么sync_task就会一直等待,这就造成一个持续等待的局面。

简单点说就是,2被5卡住了,3被2卡住了。

因此不仅2无法打印,3和5也打印不出来。
所以最终结果是4, 1或者1, 4

相关文章

  • 一段GCD函数执行过程的理解

    问主线程执行testGCD后控制台打印的结果是什么? 以上部分会异步将block任务提交到一个全局并行队列中,该任...

  • GCD的基本使用(二)

    一. 函数执行任务 GCD中有2个用来执行任务的常用函数用同步的方式执行任务 GCD中还有个用来执行任务的栅栏函数...

  • iOS GCD扩展用法

    GCD 延迟执行 GCD 一次性代码 栅栏函数(控制任务的执行顺序) 其他 补充 使用Crearte函数创建的并发...

  • 底层20:多线程-同步/异步/并发/串行

    GCD两种常用的函数: GCD中有2个用来执行任务的函数 用同步的方式执行任务:dispatch_sync(dis...

  • 多线程

    1、多线程方案 2、GCD的常用函数 GCD中有2个用来执行任务的函数1、用同步的方式执行任务dispatch_s...

  • iOS多线程总结

    iOS中的常见多线程方案 GCD的常用函数 GCD中有2个用来执行任务的函数 用同步的方式执行任务dispatch...

  • 多线程

    iOS中的常见多线程方案 GCD的常用函数 GCD中有2个用来执行任务的函数 用同步的方式执行任务 dispatc...

  • 底层-多线程

    iOS中的常见多线程方案 GCD的常用函数 GCD中有2个用来执行任务的函数 用同步的方式执行任务dispatch...

  • 多线程:GCD、常见多线程方案、查看打印结果

    iOS中的常见多线程方案 GCD的常用函数 GCD中有2个用来执行任务的函数 用同步的方式执行任务dispatch...

  • dispatch_after

    dispatch_after属于GCD,能够实现延迟执行的语法,或者说是GCD中延迟执行的函数。使用dispatc...

网友评论

      本文标题:一段GCD函数执行过程的理解

      本文链接:https://www.haomeiwen.com/subject/wnmfnftx.html