GCD

2017-03-02  本文已影响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);
   });
}
上一篇下一篇

猜你喜欢

热点阅读