dispatch_barrier_async

//写入处理不可以与写入处理和读取处理并行执行。读取处理与读取处理可并行执行
//为了高效率的进行访问:
//读取处理追加到Concurrent Dispatch Queue中,写入处理在任一个读取处理没有执行的状态下,追加到Serial Dispatch Queue中即可,在写入处理结束之前,读取处理不可执行。
//通过dispatch_barrier_async也可实现
dispatch_queue_t queue = dispatch_queue_create("Dispatch Queue的名称", DISPATCH_QUEUE_CONCURRENT);
dispatch_async(queue, ^{/*读取处理0*/});
dispatch_async(queue, ^{/*读取处理1*/});
dispatch_async(queue, ^{/*读取处理2*/});
dispatch_async(queue, ^{/*读取处理3*/});
//写入处理,之后会对写入的内容进行读取处理
//若简单的在dispatch_async函数中加入写入处理,那么根据Concurrent Dispatch Queue的性质,就有可能在追加到写入处理前面的处理中读取到与期待不符的数据,还可能因非法访问导致应用程序异常结束。如果追加多个写入处理,则可能发生更多问题,比如数据竞争。
//通过dispatch_barrier_async函数会等待追加到Concurrent Dispatch Queue上的并行执行的处理全部结束之后,再将指定的处理(异步)追加到该Concurrent Dispatch Queue中。然后在由dispatch_barrier_async函数追加的处理执行完毕后,Concurrent Dispatch Queue才恢复为一般的动作,追加到该Concurrent Dispatch Queue的处理又开始并行执行。
dispatch_barrier_async(queue, ^{/*写入处理*/});
dispatch_async(queue, ^{/*读取处理4*/});
dispatch_async(queue, ^{/*读取处理5*/});
dispatch_async(queue, ^{/*读取处理6*/});
dispatch_async(queue, ^{/*读取处理7*/});
//dispatch_barrier_sync函数与dispatch_barrier_async不同的地方是它会将指定的block同步追加到Concurrent Dispatch Queue中。在追加Block结束之前,dispatch_barrier_sync函数会一直等待。即dispatch_barrier_async不阻塞当前线程,dispatch_barrier_sync阻塞当前线程。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值