深入ObjC GCD中的dispatch group工作原理。
本文是基于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工作原理。的更多相关文章
- GCD 中使用 dispatch group 进行同步操作
话不多说,先上代码,在分析 Code - (void)viewDidLoad { [super viewDidLoad]; dispatch_group_t group1 = dispatch_gro ...
- Java中的HashMap的工作原理是什么?
问答题23 /120 Java中的HashMap的工作原理是什么? 参考答案 Java中的HashMap是以键值对(key-value)的形式存储元素的.HashMap需要一个hash函数,它使用ha ...
- drf框架中认证与权限工作原理及设置
0909自我总结 drf框架中认证与权限工作原理及设置 一.概述 1.认证 工作原理 返回None => 游客 返回user,auth => 登录用户 抛出异常 => 非法用户 前台 ...
- 分析facebook的AsyncDisplayKit框架中的Transaction的工作原理
在AsyncDisplayKit框架中有一个_ASAsyncTransaction模块,用于AsyncDiplayNode的异步事务,使用了dispatch_group实现. 主要目的是将operat ...
- 浏览器中“JavaScript解析器”工作原理
浏览器在读取HTML文件的时候,只有当遇到<script>标签的时候,才会唤醒所谓的“JavaScript解析器”开始工作. JavaScript解析器工作步骤: 1.“找一些东西”: v ...
- django中admin路由系统工作原理
一.如图所示 from django.contrib import admin from . import models class zhangsan(admin.ModelAdmin): list_ ...
- C++中dynamic_cas操作符的工作原理
http://stackoverflow.com/questions/13783312/how-does-dynamic-cast-work http://publib.boulder.ibm.com ...
- Android 基于Netty的消息推送方案之概念和工作原理(二)
上一篇文章中我讲述了关于消息推送的方案以及一个基于Netty实现的一个简单的Hello World,为了更好的理解Hello World中的代码,今天我来讲解一下关于Netty中一些概念和工作原理的内 ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(三)【转】
本文转载自:http://blog.csdn.net/mu0206mu/article/details/7464699 以下的篇幅开始分析我们在上两个篇幅中生成的update.zip包在具体更新中所经 ...
随机推荐
- POJ 3080 Blue Jeans(串)
题目网址:http://poj.org/problem?id=3080 思路: 以第一个DNA序列s为参考序列,开始做以下的操作. 1.将一个字母s[i]作为匹配串.(i为当前遍历到的下标) 2.遍历 ...
- pytest中unicode编码问题(如test_fix.py::Test1::test_s1[\u6d4b\u8bd5-\u6d4b\u8bd5])
现象: 采用如下方式可将其正确显示为中文 ss = r"test_fix.py::Test1::test_s1[\u6d4b\u8bd5-\u6d4b\u8bd5]" print( ...
- shell传递参数(三)
$n:n代表一个数字,指执行脚本的第n个参数.特别地,$0指执行的文件名 [root@ipha-dev71- exercise_shell]# cat test.sh #!/bin/bash echo ...
- python- = 与 ==的区别
一个等号代表的含义是赋值,将某一数值赋给某个变量,比如a=3,将3这个数值赋予给a. 两个等号是判断是否相等,返回True或False,比如1==1.他们是相等的,那么就返回true.1==2,他们是 ...
- vue系列---响应式原理实现及Observer源码解析(一)
_ 阅读目录 一. 什么是响应式? 二:如何侦测数据的变化? 2.1 Object.defineProperty() 侦测对象属性值变化 2.2 如何侦测数组的索引值的变化 2.3 如何监听数组内容的 ...
- 百万年薪python之路 -- MySQL数据库之 用户权限
MySQL用户授权 (来自于https://www.cnblogs.com/dong-/p/9667787.html) 一. 对新用户的增删改 1. 增加用户 : ①. 指定某一个用户使用某一个ip登 ...
- JVM学习记录3--垃圾收集器
贴个图 Serial收集器 最简单的收集器,单线程,收集器会暂停用户线程,称为"stop the world". ParNew收集器 Serial收集器的多线程版本,其它类似.默认 ...
- 函数进阶(三) day14
目录 昨日内容 迭代器 可迭代对象 迭代器对象 for循环原理 三元表达式 列表推导式 字典生成式 zip 生成器表达式 生成器 yield 递归 今日内容 匿名函数 内置方法 掌握 了解 异常处理 ...
- Java基础(十九)集合(1)集合中主要接口和实现类
1.Java集合框架为不同类型的集合定义了大量接口 其中,集合有两个基本接口:Collection和Map. 2.各接口的主要特征如下 (1)Collection接口:是List接口.Set接口和Qu ...
- 9、pytest -- 集成文档测试
目录 1. 集成doctest模块 1.1. 通过指定文本文件的方式 1.2. 通过编写文档字符串的方式 1.3. 指定额外的选项 2. 失败时继续执行 3. 指定输出的格式 4. 文档测试中使用fi ...