iOS开发系列-线程同步dispatch_barrier_async
//参数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任务。
图例说明:在添加到队列的任务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相关推荐
- iOS开发系列--通知与消息机制
http://www.cocoachina.com/ios/20150318/11364.html 概述 在多数移动应用中任何时候都只能有一个应用程序处于活跃状态,如果其他应用此刻发生了一些用户感兴趣 ...
- iOS开发系列--网络开发(转)
iOS开发系列--网络开发 2014-10-22 08:34 by KenshinCui, 66365 阅读, 56 评论, 收藏, 编辑 概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微 ...
- iOS开发系列--网络开发
概览 大部分应用程序都或多或少会牵扯到网络开发,例如说新浪微博.微信等,这些应用本身可能采用iOS开发,但是所有的数据支撑都是基于后台网络服务器的.如今,网络编程越来越普遍,孤立的应用通常是没有生命力 ...
- iOS开发系列--数据存取
原文地址为: iOS开发系列--数据存取 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook详解
代码改变世界 Posts - 69, Articles - 0, Comments - 812 Cnblogs Dashboard Login Home Contact Gallery RSS Ken ...
- IOS开发系列—Objective-C之内存管理
概述 我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没 ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总 --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS内置的一些应用软件和服务,例如 ...
- iOS开发系列–音频播放、录音、视频播放、拍照、视频录制
iOS开发系列–音频播放.录音.视频播放.拍照.视频录制 - KenshinCui - 博客园 代码改变世界 Posts - 69, Articles - 0, Comments - 1004 Cnb ...
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总,icloudpassbook
iOS开发系列--通讯录.蓝牙.内购.GameCenter.iCloud.Passbook系统服务开发汇总,icloudpassbook --系统应用与系统服务 iOS开发过程中有时候难免会使用iOS ...
最新文章
- 套接字错误处理函数的封装思想及函数实现
- [坐标]关于坐标系和投影的相关知识探讨[转]
- php按时间归档,PHP文章按日期(月日)SQL归档
- java判断总共天数_java 判断两个时间相差的天数
- k8s集群部署项目_JAVA项目(推送镜像到云镜像服务器_这里使用阿里云)---K8S_Google工作笔记0061
- svn创建tag包的简单流程
- [转载] python中实现矩阵乘法
- 计算机操作系统安装实验报告,操作系统实验报告1.doc
- 网页设计Web尺寸规范
- 基于ADS仿真的465khz检波电路
- (2)香橙派+apache2与php+天猫精灵=自建平台语音支持--香橙派操作系统安装
- ASO积分墙优化,差点毁了我家产品
- 道里云公司网络虚拟化架构NVI技术开放源代码--序言
- 在线APP设计平台,APP在线开发工具有哪些?
- HTML基础之创建简单表格
- m2无盘服务器,200台左右全网万兆台方案.doc
- 基于6818粤嵌开发板的2048游戏项目
- 基于Nginx以及web服务器搭建在线视频播放
- 视觉工程师面试50问
- OpenStack Horizon 参数设置说明
热门文章
- 计算机应用能力测试攻略,计算机应用能力测试题(一).doc
- python安装不了bs4_怎么在python安装bs4
- 设置下载安装 桌面_小妖精美化app最新版下载-小妖精美化V5.3.9.800下载安装
- docker web程序本地化_Docker教程
- mysql时间变成季度_Mysql 时间操作(当天, 昨天,7 天,30 天, 半年, 全年, 季度)
- 运行 命令 linux,Linux基本命令运行
- flume java_Flume的安装及简单的使用(一)
- 机器学习——梯度下降算法
- mongodb distinct too large用 group
- 图论算法-图论的表示、分类及基本概念(系列1)