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
相关文章推荐
- (OK) paper-5-mobicom2016-SEEM:Simulation Experimental Environments for Mobile Applications in MANETs
- 让前端独立于后端进行开发,模拟数据生成器Mock.js
- prev()方法使用的注意点
- KeilC51使用详解 (二)
- 软件工程课建议
- SpringMvc入门指南(必看)
- Exchange 2013如何更改outlook 通讯簿中用户的属性名称
- php file_put_contents时出现Permission denied的警告
- 正则表达式--find lookingAt
- GCD学习之Dispatch Group
- Android应用层View绘制流程与源码分析
- IntelliJ IDEA使用技巧
- HTML5见缝插针小游戏
- 虚拟内存简述
- linux登陆mysql数据库
- Example of ApplicationContextAware in Spring--转
- $.ajax,$.post,$.get的联系与区别
- GCD学习之dispatch_after
- Android4.4-Launcher源码分析系列之WorkSpace及屏幕滑动
- asp.net 加个弹出对话框