Dispatch Queue 之 dispatch_async

可以看到,在queue里的任务,不仅仅是一个函数,也可以是一个其他的queue。  下面是一个例子。

全局队列的处理
一般一个全局队列有多个线程,这些个线程会遍历并处理链表里的任务。
对于全局队列,当一个任务被抛进来后,会尽快处理掉。
如果有空闲线程,那么这个空闲线程会处理这个任务。
如果没有空闲线程,那么会新开一个线程来处理。
空闲线程来自哪里呢?
    do {
        _dispatch_worker_thread2(context);
        // we use 65 seconds in case there are any timers that run once a minute
    } while (dispatch_semaphore_wait(qc->dgq_thread_mediator, dispatch_time(0, 65ull * NSEC_PER_SEC)) == 0);
在线程开启以后,通过_dispatch_worker_thread2 来遍历任务。
当遍历结束以后,会保活65s。
这样子,就不用频繁的生成线程。
这就是全局队列dgq_thread_mediator的用处。
下面是判断是否有空闲线程的代码。
    if (dispatch_semaphore_signal(qc->dgq_thread_mediator)) {
        goto out;
    }
如何处理队列里的任务
    while ((item = fastpath(_dispatch_queue_concurrent_drain_one(dq)))) {
        _dispatch_continuation_pop(item);
    }
第一行是从queue里拿一个任务,第二行是处理这个任务。
注意,可能有多个线程同时去调用_dispatch_queue_concurrent_drain_one,因此这里函数里有很多原子操作与判断逻辑。
下面是_dispatch_continuation_pop的流程图。
一个流程走完,队列里的任务就会少一个。

Dispatch Queue 之 dispatch_async的更多相关文章
- GCD:  基本概念和Dispatch Queue 【转】
		
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允 ...
 - GCD介绍(一): 基本概念和Dispatch Queue
		
什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许 ...
 - GCD系列 之(一):基本概念和Dispatch Queue
		
参考学习https://www.dreamingwish.com/article/grand-central-dispatch-basic-1.html系列文章,貌似也是翻译自他处的.觉得非常完整,就 ...
 - Blocks与Dispatch Queue的使用
		
block是什么block是一个C level的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似.用于回调函数的地方.两个对象间的通讯.实现轻量级的“代理”. blocks和C语言函数指针的 ...
 - IOS开发 GCD介绍: 基本概念和Dispatch Queue
		
iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØN ...
 - GCD之dispatch queue
		
GCD之dispatch queue iOS中多线程编程工具主要有: NSThread NSOperation GCD 这三种方法都简单易用,各有千秋.但无疑GCD是最有诱惑力的,因为其本身是appl ...
 - 深入GCD(一): 基本概念和Dispatch Queue
		
什么是GCD?Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程 ...
 - 装个蒜。学习下dispatch queue
		
dispatch queue的真髓:能串行,能并行,能同步,能异步以及共享同一个线程池. 接口: GCD是基于C语言的APT.虽然最新的系统版本中GCD对象已经转成了Objective-C对象,但AP ...
 - GCD之dispatch queue深入浅出
		
GCD之dispatch queue深入浅出 http://blog.csdn.net/samuelltk/article/details/9452203
 
随机推荐
- 我的hadoop学习之路
			
Hadoop实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS.HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上. Ha ...
 - 关于吴恩达机器学习支持向量机的问题,讲到对偶前有一个最小化f(w)使用拉格朗日求解时转化成一个最大的相等式的理解和一些困惑
			
(纯属个人理解) 参考: https://www.zhihu.com/question/267482928 https://www.cnblogs.com/90zeng/p/Lagrange_dual ...
 - Jmeter正则表达式提取器二(转载)
			
转载自 http://www.cnblogs.com/qmfsun/p/5906462.html JMeter获取正则表达式中的提取的所有关联值的解决方法: 需求如下: { : "error ...
 - 微信H5支付 遇到坑的一些解决方法
			
解决办法 1. 商家参数格式有误,请联系商家解决 a.对于前后端分离的开发模式 前端发起请求 服务端请求微信h5支付统一下单接口 返回参数mweb_url 给前端 然后前端调起微信h5支付 b.注意的 ...
 - 213. House Robber II 首尾相同的偷窃问题
			
[抄题]: You are a professional robber planning to rob houses along a street. Each house has a certain ...
 - 93. Restore IP Addresses产生所有可能的ip地址
			
[抄题]: Given a string containing only digits, restore it by returning all possible valid IP address c ...
 - Python - 最大公约数算法
			
# Python 3.6 # 最大公约数,最大公因子 # Greatest Common Divisor # 辗转相除法 def gcd(num1: object, num2: object) -&g ...
 - 如何在chrome上打开SSL3.0
			
Chrome默认关闭对SSL3.0的支持,无法访问一些Web应用.可以手动打开他. 启动chrome依次选择 设置->高级->系统->打开代理设置->安全 将使用SSL 3.0 ...
 - zeromq学习记录(八)负载均衡 附ZMQ_ROUTER的流程分析
			
/************************************************************** 技术博客 http://www.cnblogs.com/itdef/ ...
 - MPLAB X IDE V4.15  创建工程,编译,问题处理
			
初步接触,有错误的地方还请大神们务必提出来,防止误导他人 硬件环境:MCU--PIC18F67K22 仿真下载器--ICD 3 编译环境:MPLAB X IDE V4.15 中文版 工作需要接触到了P ...