//参数1:将barrier添加到的队列
//参数2:barrier执行的block
void dispatch_barrier_async(dispatch_queue_t queue, dispatch_block_t block);

官方文档关于该函数的文档说明

说明:

dispatch_barrier在并发队列中创建一个同步点,当并发队列中遇到一个 dispatch_barrier时,会延时执行该 dispatch_barrier,等待在 dispatch_barrier之前提交的任务block执行完后才开始执行,之后,并发队列继续执行后续block任务。

barrier.png

图例说明:在添加到队列的任务1、任务2、任务3执行完毕后,然后才执行barrier,barrier执行完毕后才执行任务4、任务5

代码如下:

- (void)concurrentQueueBarrier{//1 创建并发队列dispatch_queue_t concurrentQueue = dispatch_queue_create("concurrentQueue", DISPATCH_QUEUE_CONCURRENT);//2 向队列中添加任务dispatch_async(concurrentQueue, ^{NSLog(@"任务1,%@",[NSThread currentThread]);});dispatch_async(concurrentQueue, ^{NSLog(@"任务2,%@",[NSThread currentThread]);});dispatch_async(concurrentQueue, ^{NSLog(@"任务3,%@",[NSThread currentThread]);});dispatch_barrier_async(concurrentQueue, ^{NSLog(@"我是barrier");});dispatch_async(concurrentQueue, ^{NSLog(@"任务4,%@",[NSThread currentThread]);});dispatch_async(concurrentQueue, ^{NSLog(@"任务5,%@",[NSThread currentThread]);});
}

执行结果:
[2126:766396] 任务1,<NSThread: 0x146da8c30>{number = 3, name = (null)}
[2126:766396] 任务2,<NSThread: 0x146da8c30>{number = 3, name = (null)}
[2126:766396] 任务3,<NSThread: 0x146da8c30>{number = 3, name = (null)}
[2126:766397] 我是barrier
[2126:766401] 任务4,<NSThread: 0x146e14610>{number = 9, name = (null)}
[2126:766401] 任务5,<NSThread: 0x146e14610>{number = 9, name = (null)}

翻译:

调用这个函数总是在barrier block被提交之后立即返回,不会等到block被执行。当barrier block到并发队列的最前端,他不会立即执行。相反,队列会等到所有当前正在执行的blocks结束执行。到这时,barrier才开始自己执行。所有在barrier block之后提交的blocks会等到barrier block结束之后才执行。

这里指定的并发队列应该是自己通过dispatch_queue_create函数创建的。如果你传的是一个串行队列或者全局并发队列,这个函数等同于dispatch_async函数。

iOS开发系列-线程同步dispatch_barrier_async相关推荐

  1. iOS开发系列--通知与消息机制

    http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...

  2. iOS开发系列--网络开发(转)

    iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 66365 阅读, 56 评论, 收藏, 编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微 ...

  3. iOS开发系列--网络开发

    概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...

  4. iOS开发系列--数据存取

    原文地址为: iOS开发系列--数据存取 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation ...

  5. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解

    代码改变世界 Posts - 69, Articles - 0, Comments - 812 Cnblogs Dashboard Login Home Contact Gallery RSS Ken ...

  6. IOS开发系列—Objective-C之内存管理

    概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...

  7. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如 ...

  8. iOS开发系列–音频播放、录音、视频播放、拍照、视频录制

    iOS开发系列–音频播放.录音.视频播放.拍照.视频录制 - KenshinCui - 博客园 代码改变世界 Posts - 69, Articles - 0, Comments - 1004 Cnb ...

  9. iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总,icloudpassbook

    iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总,icloudpassbook --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS ...

最新文章

  1. 套接字错误处理函数的封装思想及函数实现
  2. [坐标]关于坐标系和投影的相关知识探讨[转]
  3. php按时间归档,PHP文章按日期(月日)SQL归档
  4. java判断总共天数_java 判断两个时间相差的天数
  5. k8s集群部署项目_JAVA项目(推送镜像到云镜像服务器_这里使用阿里云)---K8S_Google工作笔记0061
  6. svn创建tag包的简单流程
  7. [转载] python中实现矩阵乘法
  8. 计算机操作系统安装实验报告,操作系统实验报告1.doc
  9. 网页设计Web尺寸规范
  10. 基于ADS仿真的465khz检波电路
  11. (2)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派操作系统安装
  12. ASO积分墙优化,差点毁了我家产品
  13. 道里云公司网络虚拟化架构NVI技术开放源代码--序言
  14. 在线APP设计平台,APP在线开发工具有哪些?
  15. HTML基础之创建简单表格
  16. m2无盘服务器,200台左右全网万兆台方案.doc
  17. 基于6818粤嵌开发板的2048游戏项目
  18. 基于Nginx以及web服务器搭建在线视频播放
  19. 视觉工程师面试50问
  20. OpenStack Horizon 参数设置说明

热门文章

  1. 计算机应用能力测试攻略,计算机应用能力测试题(一).doc
  2. python安装不了bs4_怎么在python安装bs4
  3. 设置下载安装 桌面_小妖精美化app最新版下载-小妖精美化V5.3.9.800下载安装
  4. docker web程序本地化_Docker教程
  5. mysql时间变成季度_Mysql 时间操作(当天, 昨天,7 天,30 天, 半年, 全年, 季度)
  6. 运行 命令 linux,Linux基本命令运行
  7. flume java_Flume的安装及简单的使用(一)
  8. 机器学习——梯度下降算法
  9. mongodb distinct too large用 group
  10. 图论算法-图论的表示、分类及基本概念(系列1)