美文网首页
浅谈GCD的线程依赖

浅谈GCD的线程依赖

作者: 尼克Nick | 来源:发表于2018-04-09 17:00 被阅读0次

之前对线程使用的不是太多,今天专门抽时间看了下GCD的线程使用。好记性不如烂笔头,整理下来方便以后复习使用,也与和大家分享一下。第一次写简书,水平有限,欢迎大家多多给出建议,互相学习。成长的路上,与大家同勉~~~~

下面进入正题

需求举例:有三个任务需要顺序执行:任务1-->任务2-->任务3

实现方式一:(线程组)

①.创建线程组:dispatch_group_t group = dispatch_group_create();

②.创建队列:dispatch_queue_t queue = dispatch_queue_create(0, 0);

③.把任务提交到队列中执行:dispatch_group_enter(group);

                                                dispatch_async(queue, ^{

                                                        [NSThread sleepForTimeInterval:2];

                                                        NSLog(@"任务1执行");

                                                        dispatch_group_leave(group);

                                                });

                                                dispatch_barrier_async(queue, ^{

                                                          NSLog(@"任务2执行");

                                                });

④.监听任务1和任务二是否执行完: dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{

        NSLog(@"任务3执行");

    });

打印结果为:任务1执行---------任务2执行----------任务3执行

划重点:①dispatch_barrier_async(queue, ^{  })方法(我一般叫做栅栏或格栅),该方法的使用要求queue为自己创建的队列,不要使用全局队列和主队列,否则就失去使用栅栏(或者格栅)方法的意义;②dispatch_group_notify(group, dispatch_get_global_queue(0, 0), ^{    })方法可以监听任务1和任务2是否完全执行完毕,只有前面的任务执行完毕之后才会执行任务3,任务3最常见的应用就是请求完数据,用于主线程的数据刷新或者继续进行其他操作;③dispatch_group_enter(group)方法和dispatch_group_leave(group)方法是成对使用的,该方法会被线程监听,可以比较安全的保证任务1和任务2妥妥的执行完毕之后再执行任务3。

实现方式二:(信号量)

①.创建俩信号量: dispatch_semaphore_t sem1 = dispatch_semaphore_create(0);

                              dispatch_semaphore_t sem2 = dispatch_semaphore_create(0);

②.执行任务:

dispatch_async(dispatch_get_global_queue(0, 0), ^{

        dispatch_semaphore_wait(sem1, DISPATCH_TIME_FOREVER);

        NSLog(@"任务3");

    });

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        dispatch_semaphore_wait(sem2, DISPATCH_TIME_FOREVER);

        NSLog(@"任务2");

        dispatch_semaphore_signal(sem1);

    });

    dispatch_async(dispatch_get_global_queue(0, 0), ^{

        NSLog(@"任务1");

        dispatch_semaphore_signal(sem2);

    });

打印结果为:任务1执行---------任务2执行----------任务3执行

划重点:①dispatch_semaphore_t 创建的信号量sem1和sem2初始值给的都是0;                   ②第一个异步任务中dispatch_semaphore_wait(sem1, DISPATCH_TIME_FOREVER)方法会检查sem1的信号量值是否>0如果>0就会执行任务3,否者就会阻塞线程,任务3不会执行;           ③同理,第二个异步任务中dispatch_semaphore_wait(sem0, DISPATCH_TIME_FOREVER)方法会检查sem0的信号量值是否>0如果>0就会执行任务2,否者就会阻塞线程,任务2不会执行;                                                                                                                                        ④ 第三个异步任务中先执行任务1,然后dispatch_semaphore_signal(sem2)方法会给sem2信号量+1,sem2信号量+1后,第二个异步任务接收到信号,就会开始执行任务2,然后再执行 dispatch_semaphore_signal(sem1)给sem1增加信号量,同时,sem2的信号量会自动-1,变成0,后续如果不再给sem2增加信号量,就会一直阻塞下去,不再继续执行;                             ⑤sem1信号量+1后,第一个异步任务接收到信号,就会开始执行任务3,同时,sem1的信号量会自动-1,变成0,后续如果不再给sem2增加信号量,就会一直阻塞下去,不再继续执行 。

相关文章

  • 浅谈GCD的线程依赖

    之前对线程使用的不是太多,今天专门抽时间看了下GCD的线程使用。好记性不如烂笔头,整理下来方便以后复习使用,也与和...

  • 如何自定义NSOperation

    在iOS中使用线程主要是GCD,和NSOperation 两种方式。 GCD 对线程依赖,线程取消支持的不是很好,...

  • iOS面试攻略,浅谈多线程开发2(GCD)

    之前写了一篇多线程开发的iOS 面试攻略,浅谈多线程开发1但是没有跟大家聊GCD 就是想把GCD单独放在一篇文章跟...

  • iOS-面试题3-多线程

    目录: GCD 加锁方案 一. GCD 说一下iOS中多线程的实现方案 ① 这些多线程方案的底层都是依赖pthre...

  • Paper Collection - Multithread

    关于iOS/OS X线程安全的基础知识(cocoaChina的文章) GCD使用经验与技巧浅谈 互斥锁pthrea...

  • 7.3 多线程-GCD

    多线程-GCD 多线程-GCD-串行并行 多线程-GCD.png GCD-线程的通讯、延时操作、定时器 GCD-线...

  • 底层原理:多线程

    iOS中常见多线程方案 NSThread 、 GCD 和 NSOperation 底层都是依赖于 pthread ...

  • 多线程研究二:NSBlockOperation通过判断isCan

    上一篇:多线程研究一:NSOperation实现GCD group依赖 本文Sample Github: Mult...

  • GCD创建线程数的上限

    检查GCD线程池大小的代码 结果 推论: GCD最多只能新建64个线程,即GCD线程池大小为64。 64个线程编号...

  • GCD的使用

    GCD的详解iOS多线程--彻底学会多线程之『GCD』 GCD线程之间的通讯 一般在主线程里面刷新UI 点击、滚动...

网友评论

      本文标题:浅谈GCD的线程依赖

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