GCD之barrier

1.在并行队列执行任务中,如果想让某一个任务先执行完后再执行其后面的任务,此时可以用dispatch_barrier_async,下图是dispatch_barrier_async函数的处理流程。

2.下面用代码体检一下


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

    dispatch_apply(5, queue, ^(size_t index) {

        NSLog(@"%ld",index);

    });

    dispatch_async(queue, ^{

        NSLog(@"a");

    });

//    dispatch_barrier_async(queue, ^{

//        NSLog(@"a");

//    });

    dispatch_apply(5, queue, ^(size_t index) {

        NSLog(@"%ld 1",index);

    });

 3.当不采用dispatch_barrier_async时,输出结果如下:

4.当采用dispatch_barrier_async时,输出结果如下:

5.总结

可以看到输出结果的不同,当不采用时a输出可以在它自身任务的后面,采用时也不会出现这样的情况。所以能说明是在并行队列中添加该函数,则会在它前面的block执行完毕后再执行它,而它后面的则在它执行完再执行。

时间: 2025-01-19 08:56:15

GCD之barrier的相关文章

给 iOS 开发者的 GCD 用户手册

本文讲的是给 iOS 开发者的 GCD 用户手册, Grand Central Dispatch,或者GCD,是一个极其强大的工具.它给你一些底层的组件,像队列和信号量,让你可以通过一些有趣的方式来获得有用的多线程效果.可惜的是,这个基于C的API是一个有点神秘,它不会明显的告诉你如何使用这个底层组件来实现更高层次的方法.在这篇文章中,我希望描述那些你可以通过GCD提供给你的底层组件来实现的一些用法. 后台工作 也许最简单的用法,GCD让你在后台线程上做一些工作,然后回到主线程继续处理,因为像那

swift版的GCD封装

swift版的GCD封装   说明 本人针对swift封装了GCD,包括GCDQueue,GCDGroup,GCDTimer以及GCDSemaphore,使用较为便利.   源码 https://github.com/YouXianMing/Swift-GCD // // GCDQueue.swift // GCD // // http://home.cnblogs.com/u/YouXianMing/ // https://github.com/YouXianMing // // Create

GCD 深入理解(一)

本文由@nixzhu翻译至raywenderlich的<grand-central-dispatch-in-depth-part-1> 虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的平滑世界.我们将分两个部分的教程来深入学习 GCD .   在这两部分的系列中,第一个部分的将解释 GCD 是做什么的,并从许多基本的 GCD 函数中找出几个来展示.在第二

漫谈GCD

多线程是程序开发中非常基础的一个概念,大家在开发过程中应该或多或少用过相关的东西.同时这恰恰又是一个比较棘手的概念,一切跟多线程挂钩的东西都会变得复杂.如果使用过程中对多线程不够熟悉,很可能会埋下一些难以预料的坑. iOS中的多线程技术主要有NSThread, GCD和NSOperation.他们的封装层次依次递增,其中: NSThread封装性最差,最偏向于底层,主要基于thread使用 GCD是基于C的API,直接使用比较方便,主要基于task使用 NSOperation是基于GCD封装的N

iOS开发之深入理解GCD

本文翻译自 http://www.raywenderlich.com/60749/grand-central-dispatch-in-depth-part-1 原作者:Derek Selander 译者:@nixzhu Github: https://github.com/nixzhu/dev-blog   虽然 GCD 已经出现过一段时间了,但不是每个人都明了其主要内容.这是可以理解的:并发一直很棘手,而 GCD 是基于 C 的 API ,它们就像一组尖锐的棱角戳进 Objective-C 的

GCD源码分析

背景 最近在浏览React Native代码的时候发现有提到Main Queue和Main Thread的区别,很早就有阅读GCD源码的冲动,这回总算找到机会了. 阅读源码之前先给个结论:Main Thread 和 Main Queue是两个不同的东西. Main Queue IS bound to Main Thread. Main Thread IS NOT bound to Main Queue. 源码剖析 关键点 queue和线程的关系 JUST REMEMBER THIS PNG!!

Grand Central Dispatch(GCD)编程基础

有过编程经验的人,基本都会接触到多线程这块. 在java中以及Android开发中,大量的后台运行,异步消息队列,基本都是运用了多线程来实现. 同样在,在ios移动开发和Android基本是很类似的一种模型. 但是很多时候,在应用开发中,我们会发现本身并没有自己编码去处理一些并发的事件,去开辟新的子线程等等. (虽然一般的调用sdk发起一个网络请求,系统都是会默认给你新起一个线程去处理的). 整个程序看上去基本就是在Main线程中执行. 确实也是这样的一种现象,因为我们基本都是在操作控件的布局,

GCD之信号量机制一

在使用NSOperationQueue进行多线程编程时,可通过[queue setMaxConcurrentOperationCount:5]来设置线程池中最多并行的线程数,在GCD中信号量机制也和它相似,可以控制并发的线程数量. 1.首先熟悉下几个函数 dispatch_semaphore_create 创建一个信号量,设置一个初始值 dispatch_semaphore_signal 发送一个信号,信号通知,信号量+1 dispatch_semaphore_wait 等待信号,信号量-1 当

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

1.GCD队列组 拦截通知和等待所有任务全部结束在继续往下执行|阻塞 需求:下载两张图片,等两张图片都下载完毕之后,合成图片(这个实例,复习的时候一定要凭空敲出代码练习,好记性不如烂键盘) <两种思路:1.线程组前两个异步函数加载url,最后在拦截函数notify合成 2.在一个子线程中就加载url获取数据,然后合成> 官方规定了,栅栏函数 只能用在调度并发队列中,不能使用在全局并发队列中