libdispatch.dylib中dispatch_group的实现
semaphore和group都是libdispatch提供的基于信号量的同步机制,dispatch_group继承自dispatch_semaphore,使用libdispatch层的信号量算法。dispatch_semaphore维护着一个dsema_value,但它同时聚合了平台的semaphore_t。
dispatch_semaphore聚合了平台提供的semaphore功能,用于同步的等待和唤醒,使用的是系统平台层提供的信号量算法,在下面的依赖图中有表示。
以linux平台为例,semaphore有两个主要的操作分别是up(释放,隐含唤醒)和down(获取,隐含等待)。在libdispatch层,提供了两个对应的扩展物dispatch_semaphore和dispatch_group,它们都依赖着了平台所提供的semaphore机制,在这之上又使用自己的semaphore算法来扩展功能。例如group提供的是full semaphore算法。
dispatch_semaphore的信号量操作分别是signal和wait,而dispatch_group的操作则分别是leave和enter。
dispatch_group的wait并不对信号量操作,但它等待的是full semaphore。dispatch_semaphore的wait则等待并获取有限的信号量资源中的一个信号量。
最后就是notifyqueue,由dsema_notify_head和dsema_notify_tail维护的tailqueue。它的作用在上篇group的工作原理中介绍过。
libdispatch.dylib中dispatch_group的实现的更多相关文章
- iOS crash log 解析 symbol address = stack address - slide 运行时获取slide的api 利用dwarfdump从dsym文件中得到symbol
概述: 为什么 crash log 内 Exception Backtrace 部分的地址(stack address)不能从 dsym 文件中查出对应的代码? 因为 ASLR(Address spa ...
- Objective-C中的消息发送总结
关于OC中的消息发送的实现,在去年也看过一次,当时有点不太理解,但是今年再看却很容易理解. 我想这跟知识体系的构建有关,如果你不认识有砖.水泥等这些建筑的基本组成部分,那么我们应该很难理解建筑是怎么建 ...
- 深入ObjC GCD中的dispatch group工作原理。
本文是基于GCD的支持库libdispatch的源代码分析的结果或是用于作为源代码阅读的参考,尽量不帖代码,力求用UML图来说明工作流. 本文参考的源代码版本为v501.20.1,如有兴趣请自行到苹果 ...
- 线上应用bug跟踪查找-友盟统计
线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...
- iOS----- Crash 分析(文二)-崩溃日志组成
iOS Crash 分析(文二)-崩溃日志组成 现在我们看一个淘宝iOS主客崩溃的例子: ### 1.进程信息 ### Incident Identifier: E4201F10-6F5F-40F9- ...
- iOS----- Crash 分析(文三)- 符号化崩溃日志
未符号化的崩溃日志就象一本天书,看不懂,更别谈分析崩溃原因了.所以我们在分析日志之前,要把日志翻译成我们可以看得懂的文字.这一步我们称之为符号化. 在iOS Crash分析(文一)中已经提到过符号化的 ...
- iOS 多线程
一 多线程基础 1.进程:进程就是系统中正在运行的应用程序.每个进程是相互独立的且都运行在各自受保护的运行空间内. 比如同时打开迅雷.Xcode,系统就会分别启动2个进程. 2.线程:进程在执行任务是 ...
- iOS GCD 编程小结
一.简单介绍 1.GCD简介? 全称是Grand Central Dispatch,可译为“牛逼的中枢调度器” 纯C语言,提供了非常多强大的函数 2.GCD优势 GCD是苹果公司为多核的并行运算提出的 ...
- iOS多线程学习及总结
能有份网上的存储资料,备以后提升及参考 iOS 多线程编程 简介 一. iOS有三种多线程编程的技术,分别是: 1. NSThread 2. Cocoa NSOp ...
随机推荐
- Halcon安装注意事项
安装使用评估版本 下载并安装 在ihalcon中下载halcon,版本随意,因为我也不知道怎么选择适合自己的版本,那就下载一个比较新的版本,19.05版本. 安装目录默认在C:\Program Fil ...
- Uipath 浏览器页面最大化和最小化
文章来源东京IT青年前线http://www.rpatokyo.com/ Uipath 浏览器页面最大化和最小化 浏览器在关闭时会自动记忆上次浏览器关闭时窗口的小,下次再次会以同样的大小打开.机器 ...
- ESP8266开发之旅 应用篇② OLED显示天气屏
1.前言 这一篇,博主将教大家怎么去实现一个简易版本的天气助手. 先来一个博主已经实现功能的图片,如下: 1.1 知识储备 本篇需要用到以下知识点: 运用到ArduinoJso ...
- 用最简单的方式学Python单链表
Python 实现单链表 在本博客中,我们介绍单链表这种数据结构,链表结构为基于数组的序列提供了另一种选择(例如Python列表). 基于数组的序列和链表都能够对其中的元素保持一定得顺序,但采用的方式 ...
- PHPStorm IntelliJ IDEA 代码缩进风格设置
关于缩进风格,我还是觉得4空格比tab好 File -> Settings -> Editor -> Code Style: 如图,把Detect and use exsiting ...
- Java多线程编程(五)定时器Timer
一.定时器Timer的使用 在JDK库中Timer类主要负责计划任务的功能,也就是在指定的时间开始执行某一个任务.Timer类的主要作用就是设置计划任务,但封装任务的类确实TimerTask类,执行计 ...
- 什么是Viewport
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机 ...
- (23)ASP.NET Core EF关系数据库建模
1.简介 一般而言,本部分中的配置适用于关系数据库.安装关系数据库提供程序时,此处显示的变为可用扩展方法(原因在于共享的Microsoft.EntityFrameworkCore.Relational ...
- 《JavaScript设计模式与开发实践》-- 迭代器模式
详情个人博客:https://shengchangwei.github.io/js-shejimoshi-diedaiqi/ 迭代器模式 1.定义 迭代器模式: 是指提供一种方法顺序访问一个聚合对象中 ...
- net core WebApi——公用库April.Util公开及发布
前言 在之前鼓捣过一次基础工程April.WebApi后,就考虑把常用的类库打包做成一个公共类库,这样既方便维护也方便后续做快速开发使用,仓库地址:April.Util_github,April.Ut ...