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
原创粉丝点击