本文是基于GCD的支持库libdispatch的源代码分析的结果或是用于作为源代码阅读的参考,尽量不帖代码,力求用UML图来说明工作流。

本文参考的源代码版本为v501.20.1,如有兴趣请自行到苹果的开源项目网站下载。

dispatch group的相关代码位于dispatch_semaphore.c模块中。下面是分析后的活动图:

dispatch group是一个基于信号量的同步机制,主要提供了下面5个函数:

enter,

leave,

wait,

async,

notify.

活动图中有4组控制流,分别开始于图的四个角,中间有一个同步符号,结合在一起来反应dispatch group的运作原理。

左上角有三条并行的async控制流。调用async方法,将会隐式进行enter和leave,并且分别在不同的两条(并行或异步的控制流)中进行。

右上角是基本形式,在同一条控制流中,enter,处理,然后leave。

左下角是wait的控制流,使用了阻塞等待,等待full semaphore。

右下角是notify的控制流,有两个分支,一个是full semaphore满足,直接唤醒各方的wait,接着就处理notify块;另一个分支则是不满足,但并不用像wait那样采用阻塞等待的方式,而是放入到group的notifyqueue中让将来满足full semaphore后,由另它控制流fork一条控制流(使用notify函数时,指定了dispatch的队列)来处理notify块。

最后就是由谁来唤醒,由图的中间唯一的同步符号可以看到,同步的入流都是或显式或隐式地进行了leave,也就是说在每条控制流执行了leave,都要负责检查full semaphore是否满足,满足则然后唤醒。

说明:这里的fork不一定产生一条线程,在libdispatch框架中,dispatch_async来dispatch到不同的队列由线程调度,达到并行目的。

多谢路过的你观看。

后面将会有两篇文补充,一篇是再说明libdispatch中的group,另一篇则是facebook的开源框架asdk是如何使用了这种同步机制。

深入ObjC GCD中的dispatch group工作原理。的更多相关文章

  1. GCD 中使用 dispatch group 进行同步操作

    话不多说,先上代码,在分析 Code - (void)viewDidLoad { [super viewDidLoad]; dispatch_group_t group1 = dispatch_gro ...

  2. Java中的HashMap的工作原理是什么?

    问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...

  3. drf框架中认证与权限工作原理及设置

    0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...

  4. 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理

    在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...

  5. 浏览器中“JavaScript解析器”工作原理

    浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤: 1.“找一些东西”: v ...

  6. django中admin路由系统工作原理

    一.如图所示 from django.contrib import admin from . import models class zhangsan(admin.ModelAdmin): list_ ...

  7. C++中dynamic_cas操作符的工作原理

    http://stackoverflow.com/questions/13783312/how-does-dynamic-cast-work http://publib.boulder.ibm.com ...

  8. Android 基于Netty的消息推送方案之概念和工作原理(二)

    上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...

  9. Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】

    本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ...

随机推荐

  1. MS09-020 iis6.0提权

    漏洞编号:MS09-020 披露日期: 2009/6/9 受影响的操作系统:Windows 2003 x64 sp1 sp2;XP; 测试系统:windows 2003 x64   上传 执行 iis ...

  2. 百万年薪python之路 -- 模块

    1.自定义模块 1.1.1 模块是什么? 模块就是文件,存放一堆常用的函数和变量的程序文件(.py)文件 1.1.2 为什么要使用模块? 1.避免写重复代码,从文件级别组织程序,更方便管理 2.可以多 ...

  3. Eureka -- 浅谈Eureka

    目录: 一:Eureka介绍 二:Eureka架构图 三:Eureka组件 四:Eureka作用 五:Eureka和Zookeeper对比 什么是Eureka 引入SpringCloud中文文档介绍 ...

  4. mySQL的安装过程---二进制和源码安装

    安装 mysql 源码包安装 优化基础源 [root@db03 ~]# vim /etc/yum.repos.d/CentOS-Base.repo 安装依赖包 [root@db03 ~]# yum i ...

  5. 你好,Go语言

    本文是「vangoleo的Go语言学习笔记」系列文章之一. 官网: http://www.vangoleo.com/go/hello-golang/ 我在2015年第一次接触Go语言,完成了Hello ...

  6. 设计模式(九)Bridge模式

    Bridge模式就是将类的功能层次结构和类的实现层次结构连接起来. 类的功能层次结构就是根据实际非抽象类来说的,也就是父类具有基本功能,然后在子类中增加新功能.用于增加新功能. 类的实现层次结构就是根 ...

  7. krry-transfer ⏤ 基于 element 的升级版穿梭框组件发布到 npm 啦

    博客地址:https://ainyi.com/81 基于 element ui 的==升级版穿梭框组件==发布到 npm 啦 看过我之前博客的同学或许知道我之前写过关于 element 穿梭框组件重构 ...

  8. 设计模式C++描述----06.适配器(Adapter)模式

    一. 定义 适配器模式将一个类的接口转换成客户希望的另外一个接口,使得原本由于接口不兼容而不能一起工作的那些类可以一起工作. Adapter 模式的两种类别:类模式和对象模式. 二. 举例说明 实际中 ...

  9. 读书笔记-《Maven实战》-2018/5/3

    5.7依赖调解 1.当一个项目有以下依赖关系的时候:A->B->C->X(1.0).A->D->X(2.0),X作为A的传递依赖而拥有两个版本,Maven为了解决以上问题 ...

  10. 【XSY2344】K-th String

    Description Alice有 n(n≤26) 张牌,牌上分别标有前 n 个英文小写字母.例如,如果 n=3 ,则Alice有3张牌,分别标有"a", "b&quo ...