GCD

作者: 李波小丑 | 来源:发表于2017-03-02 08:06 被阅读0次

并发
很多人同时排队买火车票
并行
火车站有5个窗口同时卖票

dispatch_set_target_queue

变更生成的Dispatch Queue的执行优先级
dispatch_set_target_queue(queue1,queue2);
queue1:指定要变更优先级的queue
queue2:指定queue1与queue2使用相同优先级
第一个参数如果指定为系统提供的 Main Dispatch Queue 则不知道会发生什么。因此不可指定。
如果在多个 Serial Dispatch Queue 中用dispatch_set_target_queue函数指定目标为某一 Serial Dispatch Queue,那么原本应并行执行的多个 Serial Dispatch Queue 同时只能执行一个

dispatch_after

3秒后执行

dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_SEC); // 3秒
//dispatch_time_t time = dispatch_time(DISPATCH_TIME_NOW, 3ull*NSEC_PER_MSEC); // 3毫秒
dispatch_after(time, dispatch_get_main_queue(), ^{
        
});

Dispatch Group

dispatch_barrier_async

dispatch_sync

dispatch_apply

按指定的次数将指定的block追加到指定的 Dispatch Queue 中,并等全部处理执行结束。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(10, queue, ^(size_t index) {
   NSLog(@"%zu",index);
});
NSLog(@"done");

0
2
1
4
5
6
7
8
9
3
done

dispatch_suspend / dispatch_resume

挂起指定的 Dispatch Queue
dispatch_suspend(queue);
恢复指定的 Dispatch Queue
dispatch_resume(queue);
这两个方法对已经执行的处理没有影响。挂起后,追加到 Dispatch Queue 中但尚未执行的处理会被挂起,

Dispatch Semaphore

Dispatch Semaphore 是持有计数的信号,该计数是多线程编程中的计数类型信号。所谓信号,类似于过马路时常用的手旗,可以通过时举起手旗,不可通过时放下手旗。而在 Dispatch Semaphore中,使用计数来实现该功能。计数为0时等待,计数为1或大于1时,减去1而不等待。

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
/*
 * Dispatch Semaphore 的计数初始值设定为 1
 * 保证访问 NSMutableArray 类对象的线程同时只有一个
 */
dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
NSMutableArray *array = [[NSMutableArray alloc] init];
for (int i=0; i<10; ++i) {
   dispatch_async(queue, ^{
       /*
        * 等待 Dispatch Semaphore
        * 一直等待,直到 Dispatch Semaphore 的计数值达到大于等于1
        */
       dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
       
       /*
        * 由于semaphore的初始值为1,达到dispatch_semaphore_wait的执行条件
        * 将semaphore的计数减一  semaphore计数=0
        */
       [array addObject:[NSNumber numberWithInt:i]];
       
       /*
        * 排他控制处理结束
        * 将semaphore计数加一  semaphore计数=1
        * 达到dispatch_semaphore_wait的执行条件
        * 由最先等待的线程执行
        */
       dispatch_semaphore_signal(semaphore);
   });
}

相关文章

  • 多线程之GCD

    GCD介绍 1、GCD简介 2、GCD任务和队列 3、GCD 的基本使用 4、GCD 线程间的通信 5、GCD 的...

  • 扩展GCD(求逆元,解同余方程等等)

    首先要知道gcd函数的基本性质:gcd(a,b)=gcd(b,a)=gcd(|a|,|b|)=gcd(b,a%b)...

  • iOS - GCD

    目录 GCD简介 GCD核心概念 GCD队列的使用 GCD的常见面试题 GCD简介 Grand Central D...

  • iOS-多线程:GCD

    GCD 简介 GCD 任务和队列 GCD 的使用步骤 GCD 的基本使用(6种不同组合区别) GCD 线程间的通信...

  • 浅析GCD

    GCD目录: 1. GCD简介 为什么要用GCD呢? GCD可用于多核的并行运算GCD会自动利用更多的CPU内核(...

  • 7.3 多线程-GCD

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

  • iOS 多线程--GCD

    一、GCD基本介绍 1.GCD简介 GCD是Grand Central Dispatch的缩写,GCD是苹果推出的...

  • 自用算法模板(JAVA版)

    一、数论 1)GCD GCD(求最大公约数) QGCD(快速GCD) extGCD(拓展GCD,解决ax + by...

  • GCD介绍

    一、GCD简单介绍 什么是GCD GCD优势 任务和队列 GCD有2个核心概念 GCD的使用就2个步骤 将任务添加...

  • 7.多线程基础(七)GCD加强

    1.GCD串行队列和并发队列 2.GCD延时执行 3.GCD线程组:(的作用) 4.GCD定时器: GCD的实现 ...

网友评论

      本文标题:GCD

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