GCD栅栏函数dispatch_barrier

需求: 有4个任务, 需要开启多条线程去执行。 有一个特殊任务0, 需要在1,2任务执行完后, 再执行3, 4任务。

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #78492a; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
p.p4 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #703daa }
span.s2 { color: #000000 }
span.s3 { color: #3e1e81 }
span.s4 { color: #d12f1b }

dispatch_queue_t queue = dispatch_queue_create("test", DISPATCH_QUEUE_CONCURRENT);

dispatch_async(queue, ^{

NSLog(@"-------1----%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"-------2----%@",[NSThread currentThread]);

});

//加入栅栏函数,执行任务0

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
span.s1 { color: #000000 }
span.s2 { color: #ba2da2 }
span.s3 { color: #272ad8 }
span.s4 { color: #3e1e81 }
span.s5 { color: #d12f1b }

  dispatch_barrier_async(queue, ^{//不能使用全局队列

NSLog(@"barrier");

});

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #3e1e81; background-color: #ffffff }
p.p2 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff; min-height: 16.0px }
p.p3 { margin: 0.0px 0.0px 0.0px 0.0px; font: 14.0px Menlo; color: #000000; background-color: #ffffff }
span.s1 { color: #000000 }
span.s2 { color: #d12f1b }
span.s3 { color: #703daa }

  dispatch_async(queue, ^{

NSLog(@"-------3----%@",[NSThread currentThread]);

});

dispatch_async(queue, ^{

NSLog(@"-------4----%@",[NSThread currentThread]);

});

栅栏函数:  拦截前面的并发任务, 等待栅栏函数执行完后 ,再执行后面的并发任务。

警告:栅栏函数不能使用全局队列(global_queue)

dispatch_barrier_async 与 dispatch_barrier_sync的区别:

同步栅栏函数会等待栅栏函数内的任务执行完,再执行后面的主线程或者子线程任务。

异步栅栏函数不会等待栅栏函数内任务执行完,就会执行后面主线程的任务。

异步栅栏函数不会阻塞主线程。

原文地址:https://www.cnblogs.com/dashengios/p/10416063.html

时间: 2024-10-13 05:42:02

GCD栅栏函数dispatch_barrier的相关文章

多线程基础(七)GCD线程组+栅栏函数

1.GCD队列组 拦截通知和等待所有任务全部结束在继续往下执行|阻塞 需求:下载两张图片,等两张图片都下载完毕之后,合成图片(这个实例额外补充) 官方规定了,栅栏函数 只能用在并发队列中,不能使用在全局并发队列中

GCD中的dispatch_barrier_async函数的使用(栅栏函数)

<一>什么是dispatch_barrier_async函数 毫无疑问,dispatch_barrier_async函数的作用与barrier的意思相同,在进程管理中起到一个栅栏的作用,它等待所有位于barrier函数之前的操作执行完毕后执行,并且在barrier函数执行之后,barrier函数之后的操作才会得到执行,该函数需要同dispatch_queue_create函数生成的concurrent Dispatch Queue队列一起使用 <二>dispatch_barrier

GCD那些事儿

GCD GCD,全名Grand Central Dispatch,中文名郭草地,是基于C语言的一套多线程开发API,一听名字就是个狠角色,也是目前苹果官方推荐的多线程开发方式.可以说是使用方便,又不失逼格.总体来说,他解决我提到的上面直接操作线程带来的难题,它自动帮你管理了线程的生命周期以及任务的执行规则.下面我们会频繁的说道一个词,那就是任务,说白了,任务其实就是你要执行的那段代码. 任务管理方式--队列 上面说当我们要管理多个任务时,线程开发给我们带来了一定的技术难度,或者说不方便性,GCD

Object-C关于GCD多线程的使用

```objc1 使用Crearte函数创建的并发队列和全局并发队列的主要区别: 1)全局并发队列在整个应用程序中本身是默认存在的并且对应有高优先级.默认优先级.低优先级和后台优先级一共四个并发队列,我们只是选择其中的一个直接拿来用.而Create函数是实打实的从头开始去创建一个队列. 2)在iOS6.0之前,在GCD中凡是使用了带Create和retain的函数在最后都需要做一次release操作.而主队列和全局并发队列不需要我们手动release.当然了,在iOS6.0之后GCD已经被纳入到

创建线程方式-GCD

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: pointer; position: absolute

GCD的相关函数使用

GCD 是iOS多线程实现方案之一,非常常用 英文翻译过来就是伟大的中枢调度器,也有人戏称为是牛逼的中枢调度器 是苹果公司为多核的并行运算提出的解决方案 1.一次性函数 dispatch_once 顾名思义是只执行一次的函数,注意是整个程序中只执行一次(单例模式常用到) - (void)once { //一次性函数,只执行函数 static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ //里面默认线程安全的 NSLog(@&quo

iOS 多线程之 GCD 的基本使用

什么是GCD 全称Grand Central Dispatch 中暑调度器 纯C语言 提供了很多强大的函数 GCD 的优势 GCD是苹果公司为多核的并行运算提出的解决方案 GCD会自动利用更多的CPU内核(比如 双核 四核) GCD会自动管理线程的生命周期 (创建线程 调度任务 销毁线程) 程序员只需要告诉GCD想要执行什么任务 不需要编写任何线程管理的代码 GCD的核心概念任务和队列 任务: 需要执行的操作 队列:用来存放任务 调度任务 安排任务在哪个线程中执行 GCD的使用步骤 1 定制任务

iOS多线程全套:线程生命周期,多线程的四种解决方案,线程安全问题,GCD的使用,NSOperation的使用

目的 本文主要是分享iOS多线程的相关内容,为了更系统的讲解,将分为以下7个方面来展开描述. 多线程的基本概念 线程的状态与生命周期 多线程的四种解决方案:pthread,NSThread,GCD,NSOperation 线程安全问题 NSThread的使用 GCD的理解与使用 NSOperation的理解与使用 Demo在这里:WHMultiThreadDemo Demo的运行gif图如下: 一.多线程的基本概念 进程:可以理解成一个运行中的应用程序,是系统进行资源分配和调度的基本单位,是操作

iOS 多线程:『GCD』详尽总结

本文用来介绍 iOS 多线程中 GCD 的相关知识以及使用方法.这大概是史上最详细.清晰的关于 GCD 的详细讲解+总结的文章了.通过本文,您将了解到: 1. GCD 简介 2. GCD 任务和队列 3. GCD 的使用步骤 4. GCD 的基本使用(6种不同组合区别) 5. GCD 线程间的通信 6. GCD 的其他方法(栅栏方法:dispatch_barrier_async.延时执行方法:dispatch_after.一次性代码(只执行一次):dispatch_once.快速迭代方法:dis