GCD 串行队列,并发队列和主队列的整理
来源:互联网 发布:unity3d和kinect 编辑:程序博客网 时间:2024/05/21 22:57
1.串行队列:Dispatch Queues或者 Serial Queues
同步
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil); dispatch_sync(queue, ^(void) { sleep(2-i/50); NSLog(@"The sum is: %d", i); //flag = YES; });dispatch_release(queue);
异步
dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil); dispatch_async(queue, ^(void) { sleep(2-i/50); NSLog(@"The sum is: %d", i); // signal the semaphore //dispatch_semaphore_signal(sem); });dispatch_release(queue);
当主线程在等待信号量时,操作系统会直接将它挂起,因此不会去死做标志轮询,而能够及时将CPU资源给其它可被调度的线程使用。
__block dispatch_semaphore_t sem = dispatch_semaphore_create(0); dispatch_queue_t queue = dispatch_queue_create("zenny_chen_firstQueue", nil); dispatch_async(queue, ^(void) { sleep(2-i/50); NSLog(@"The sum is: %d", i); // signal the semaphore dispatch_semaphore_signal(sem); }); // wait for the semaphore dispatch_semaphore_wait(sem, DISPATCH_TIME_FOREVER); dispatch_release(queue);
2.并发队列 :Concurrent Queues
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_queue_t aHQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0); dispatch_queue_t aLQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, 0);
3.主队列:main dispatch Queue
dispatch_queue_t mainQueue = dispatch_get_main_queue();
针对以上3种队列:concurrent queues和main queue都是由系统生成而且 dispatch_suspend, dispatch_resume, dispatch_set_context这些函数对他们无效。
但是我们的应用不是简单的同步也异步的运行,应用经常是混合的。
比如我们要task1 task2 task3都运行完成后才能异步运行task4 task5 task6我们该怎么做呢?这里我们可以引入group的概念。
-(void)sixthMethod{ //获取concurrent queue dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); //创建1个queue group dispatch_group_t queueGroup = dispatch_group_create(); //任务1 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 1."); }); //任务2 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 2."); }); //任务3 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 3."); }); NSLog(@"wait task 1,2,3."); //等待组内任务全部完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); NSLog(@"task 1,2,3 finished."); //释放组 dispatch_release(queueGroup); //重新创建组 queueGroup = dispatch_group_create(); //任务4 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 4."); }); //任务5 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 5."); }); //任务6 dispatch_group_async(queueGroup, aQueue, ^{ NSLog(@"task 6."); }); NSLog(@"wait task 4,5,6."); //等待组内任务全部完成 dispatch_group_wait(queueGroup, DISPATCH_TIME_FOREVER); NSLog(@"task 4,5,6 finished."); //释放组 dispatch_release(queueGroup); }
代码运行结果:
2013-05-13 13:55:33.783 GDC[2466:1303] task 1.
2013-05-13 13:55:33.783 GDC[2466:3a07] task 3.
2013-05-13 13:55:33.783 GDC[2466:c07] wait task 1,2,3.
2013-05-13 13:55:33.783 GDC[2466:1903] task 2.
2013-05-13 13:55:33.787 GDC[2466:c07] task 1,2,3 finished.
2013-05-13 13:55:33.788 GDC[2466:c07] wait task 4,5,6.
2013-05-13 13:55:33.788 GDC[2466:1303] task 4.
2013-05-13 13:55:33.788 GDC[2466:1903] task 5.
2013-05-13 13:55:33.788 GDC[2466:3a07] task 6.
2013-05-13 13:55:33.790 GDC[2466:c07] task 4,5,6 finished.
- GCD 串行队列,并发队列和主队列的整理
- GCD 串行队列,并发队列和主队列的整理
- GCD-同步,异步分别在串行队列,并发队列,主队列下的执行方式
- GCD 主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- GCD主队列死锁和全局队列
- GCD主队列、全局队列
- CGD全局并发队列和主队列的应用
- GCD介绍。串行队列、并行队列、全局队列、主队列、同步任务、异步任务
- GCD之主队列、全局并发队列、以及同步任务的执行
- GCD编程中的主队列和全局队列
- IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别
- iOS学习笔记74-IOS多线程知识总结/队列概念/GCD/主队列/并行队列/全局队列/主队列/串行队列/同步任务/异步任务区别附代码
- GCD全局队列与主队列
- ios-day19-02(GCD介绍。串行队列、并行队列、全局队列、主队列、同步任务、异步任务)
- iOS GCD/主队列/并行队列/全局队列/串行队列/同步任务/异步任务区别 含代码
- iOS 之GCD串行和并发队列的理解
- iOS 之GCD串行和并发队列的理解
- GCD的串行队列和并行队列
- loadrunner中并发数与迭代的区别(转载)
- [小代码]简单的对话框设置标题、消息、图标和按钮
- POJ2965
- Android静默安装
- (转载)如何成为一名优秀的程序员?
- GCD 串行队列,并发队列和主队列的整理
- 红帽企业版yum时提示系统未注册的解决办法
- 最精确的手机电量校正方法,完全恢复电量,提高使用时间
- Effective C++ 学记之16 成对使用new和delete时要采取相同形式
- Push Box
- IPHONE实景导航开发总结
- 使用 Counter Analyzer 进行 Performance Monitor Counter 数据分析
- [小代码]在Android和PHP之间的加密/解密,AES加密
- 点类为基类声明为共有继承调用基类的私有成员