Grand Central Dispatch 顺序执行和并行执行
来源:互联网 发布:meta分析数据提取表 编辑:程序博客网 时间:2024/05/01 00:40
三个block,供GCD调用。
void (^testBlock1)(void) = ^{ NSLog(@"1111"); sleep(2); NSLog(@"1111_end");};void (^testBlock2)(void) = ^{ NSLog(@"2222"); sleep(2); NSLog(@"2222_end");};void (^testBlock3)(void) = ^{ NSLog(@"3333");};
1,Serial 顺序执行
创建
//Serial dispatch queue //先进先出队列。需要一个block执行完之后才能执行。使用一个线程。dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_SERIAL);//等价于 dispatch_queue_t queue = dispatch_queue_create("testQueue", NULL);//注:第一个参数是队列的名称,不建议用NULL。因为调试中,出现程序崩溃,这个名称会出现在崩溃日志中。执行
dispatch_async(queue, testBlock1); dispatch_async(queue, testBlock2); dispatch_async(queue, testBlock3);结果:
1111 1111_end2222 2222_end3333
2,Concurrent 并发执行
创建
//Concurrent dispatch queue //并发执行,没有先后顺序。使用多个线程。dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT);
执行
dispatch_async(queue, testBlock1);dispatch_async(queue, testBlock2);dispatch_async(queue, testBlock3);
结果:没有固定的执行顺序
3,在一个并发的queue中,可能会出现数据竞争问题。(为了提高性能,并发读取某个数据是没有问题的,要修改数据的话,需要顺序执行)
为了解决这个问题,可以用dispatch_barrier_async //可在并行队列中顺序执行某个操作
dispatch_async(queue, testBlock1); dispatch_async(queue, testBlock2); dispatch_barrier_async(queue, ^{ NSLog(@"write"); }); dispatch_async(queue, testBlock3);//block1,block2,block3分别执行的是读取操作。
执行顺序,block1和block2执行完后,执行写操作,写完后,再执行block3.
4,多个queue时,设置依赖关系。(在一定程度上解决数据竞争问题)
改变已经生成的dispatch queue执行顺序,用dispatch_set_target_queue(queue2,queue1)这个函数。
dispatch_queue_t queue = dispatch_queue_create("testQueue", DISPATCH_QUEUE_CONCURRENT); dispatch_queue_t queue2 = dispatch_queue_create("testQueue2", DISPATCH_QUEUE_SERIAL); dispatch_set_target_queue(queue2, queue); dispatch_async(queue, testBlock1); dispatch_async(queue, testBlock3); dispatch_async(queue2, testBlock2);
结果:
111133331111_end2222 2222_end或者33331111 1111_end2222 2222_end说明:block2 总是在两个并行执行的block1和block3执行完之后才执行。
但是如果改变代码顺序:
dispatch_async(queue, testBlock1); dispatch_async(queue2, testBlock2); dispatch_async(queue, testBlock3);
因为队列queue是并行执行,所以block3可能会在block2前执行。如果block2和block3都对一个数据进行操作,会出现数据数据不一致的问题。需要注意,尽可能的要避免这种问题。
5,在ARC中,对于dispatch_queue_create创建的对象,按说应该要执行dispatch_release函数释放内存。尼玛,但是添加后竟然报错了。
系统不断的在升级,看的资料有些陈旧了,原来iOS 6.0,ARC将会为你管理dispatch queues和其它的GCD类型。
以上内容纯属个人理解,如有错误请反馈。
意见反馈:uugrass@gmail.com
0 0
- Grand Central Dispatch 顺序执行和并行执行
- Grand Central Dispatch(GCD)介绍和使用
- Grand Central Dispatch(GCD)介绍和使用
- Grand Central Dispatch简介
- Grand Central Dispatch (GCD)
- block && Grand Central Dispatch
- Grand Central Dispatch简介
- block && Grand Central Dispatch
- Grand Central Dispatch
- Grand Central Dispatch简介
- Grand Central Dispatch
- Grand Central Dispatch Introduction
- GCD(Grand Central Dispatch)
- Grand Central Dispatch(GCD)
- Grand Central Dispatch
- Grand Central Dispatch (GCD
- Grand Central Dispatch
- Grand Central Dispatch (GCD)
- 触发器系列(1)Trigger
- 制作自己的特色PE----Mr.Zhang
- Redis学习笔记11--Redis分布式
- WinInet API浅谈
- 项目那点儿事儿
- Grand Central Dispatch 顺序执行和并行执行
- 阿拉伯语字母表
- 基于用户投票的排名算法(一):Delicious和Hacker News
- c语言---循环结构
- 如何使用手机GPS及手机定位系统
- leetcode第一刷_Valid Number
- 8051与8086、8088的区别
- 5. 递归调用
- 修改searchbar在iOS7以下、iOS7、iOS7.1的背景色