您的位置:首页 > 其它

GCD学习之dispatch_barrier_async

2016-06-03 10:48 429 查看

dispatch_barrier_async

访问数据库或文件时,使用Serial Dispatch Queue可避免数据竞争的问题。

写入处理确实不可与其他的写入处理以及包含读取处理的其他某些问题并行执行。但是如果读取处理只是与读取处理并行执行,那么多个并行执行就不会发生问题。

为了高效率地进行访问,读取处理追加到Concurrent Dispatch Queue中,写入处理在任一个读取处理没有执行的状态下,追加到Serial Dispatch Queue 中即可(在写入处理结束之前,读取处理不可执行)。

解决方法:
dispatch_barrier_async
函数同
dispatch_create_queue
函数生成的Concurrent Dispatch Queue一起使用。

首先
dispatch_queue_create
函数生成Concurrent Dispatch Queue,在
dispatch_async
中追加读取处理。

dispatch_queue_t  queue = dispatch_queue_create("com.example.gcd.ForBarrier",DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue,blk0_for_reading);
dispatch_async(queue,blk1_for_reading);
dispatch_async(queue,blk2_for_reading);
dispatch_async(queue,blk3_for_reading);
dispatch_async(queue,blk4_for_reading);
dispatch_async(queue,blk5_for_reading);
dispatch_async(queue,blk6_for_reading);
dispatch_async(queue,blk7_for_reading);

dispatch_release(queue);


blk3_for_reading
处理和
blk4_for_reading
处理之间执行写入处理,并将写入的内容读取
blk4_for_reading
处理以及之后的处理中。

dispatch_async(queue,blk0_for_reading);
dispatch_async(queue,blk1_for_reading);
dispatch_async(queue,blk2_for_reading);
dispatch_async(queue,blk3_for_reading);
/*
*写入处理
*将写入的内容读取之后的处理中
*/
dispatch_async(queue,blk4_for_reading);
dispatch_async(queue,blk5_for_reading);
dispatch_async(queue,blk6_for_reading);
dispatch_async(queue,blk7_for_reading);


我们使用
dispatch_barrier_async
函数。
dispatch_barrier_async
函数会等待追加到Concurrent Dispatch Queue上的并行执行的处理全部结束之后,再将指定的处理追加到该Concurrent Dispatch Queue中。然后在由
dispatch_barrier_async
函数追加的处理完毕后,Concurrent Dispatch Queue 才恢复为一般的动作,追加到该Concurrent Dispatch Queue 的处理又开始并行执行。

dispatch_async(queue,blk0_for_reading);
dispatch_async(queue,blk1_for_reading);
dispatch_async(queue,blk2_for_reading);
dispatch_async(queue,blk3_for_reading);
dispatch_barrier_async(queue,blk_for_writing);
dispatch_async(queue,blk4_for_reading);
dispatch_async(queue,blk5_for_reading);
dispatch_async(queue,blk6_for_reading);
dispatch_async(queue,blk7_for_reading);


使用Concurrent Dispatch Queue和
dispatch_barrier_async
函数可实现高效率的数据库访问和文件访问。

GCD合集:

GCD

dispatch_set_target_queue

dispatch_after

Dispatch Group

dispatch_barrier_async

dispatch_sync

dispatch_apply

dispatch_suspend/dispatch_resume

Dispatch Semaphore

dispatch_once

Dispatch I/O
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: