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的流程图。
一个流程走完,队列里的任务就会少一个。

?

原文地址:https://www.cnblogs.com/huahuahu/p/dispatch-queue-zhi-dispatchasync.html

时间: 2024-10-04 02:07:45

Dispatch Queue 之 dispatch_async的相关文章

GCD基本概念和Dispatch Queue

什么是GCD? Grand Central Dispatch或者GCD,是?一套低层API,提供了?一种新的?方法来进?行并发程序编写.从基本功能上讲,GCD有点像NSOperationQueue,他们都允许程序将 任务切分为多个单?一任务然后提交?至?工作队列来并发地或者串?行地执?行.GCD?比之NSOpertionQueue更底层更?高效,并且它不是Cocoa框架的?一部分. 除了代码的平?行执?行能?力,GCD还提供?高度集成的事件控制系统.可以设置句柄来响应?文件描述符.mach po

GCD: 基本概念和Dispatch Queue 【转】

什么是GCD? Grand Central Dispatch或者GCD,是一套低层API,提供了一种新的方法来进行并发程序编写.从基本功能上讲,GCD有点像 NSOperationQueue,他们都允许程序将任务切分为多个单一任务然后提交至工作队列来并发地或者串行地执行.GCD比之 NSOpertionQueue更底层更高效,并且它不是Cocoa框架的一部分. 除了代码的平行执行能力,GCD还提供高度集成的事件控制系统.可以设置句柄来响应文件描述符.mach ports(Mach port 用于

IOS开发 GCD介绍: 基本概念和Dispatch Queue

iOS的三种多线程技术 1.NSThread 每个NSThread对象对应一个线程,量级较轻(真正的多线程) 2.以下两点是苹果专门开发的“并发”技术,使得程序员可以不再去关心线程的具体使用问题 ØNSOperation/NSOperationQueue 面向对象的线程技术 ØGCD —— Grand Central Dispatch(派发) 是基于C语言的框架,可以充分利用多核,是苹果推荐使用的多线程技术 以上这三种编程方式从上到下,抽象度层次是从低到高的,抽象度越高的使用越简单,也是Appl

GCD之dispatch queue深入浅出

GCD之dispatch queue深入浅出 http://blog.csdn.net/samuelltk/article/details/9452203

装个蒜。学习下dispatch queue

dispatch queue的真髓:能串行,能并行,能同步,能异步以及共享同一个线程池. 接口: GCD是基于C语言的APT.虽然最新的系统版本中GCD对象已经转成了Objective-C对象,但API仍保持纯C接口(加了block扩展).这对实现底层接口是好事,GCD提供了出色而简单的接口. Objective-C类名称为MADispatchQueue,包含四个调用方法: 1. 获取全局共享队列的方法.GCD有多个不同优先级的全局队列,出于简单考虑,我们在实现中保留一个. 2. 串行和并行队列

NSThread 、NSRunLoop 和 Dispatch Queue

iOS多线程编程中,NSOperation和NSOperationQueue无疑是最常用的,它们能满足绝大部分情况下的线程操作.但在完成一些特殊的任务时,我们还是要使用的NSThread和NSRunLoop. NSThread很好理解,它等同于Java中的Thread类. NSRunLoop却不太好理解.从字面上说,RunLoop可以翻译成“运行回路”或“运行循环”,我们可以把它看成是一种特殊的循环结构——我们知道for或者while循环语句,其实NSRunLoop就是一种类似的循环,只不过它比

创建Dispatch Queue

第一.dispatch_queue_create 用于创建用户线程队列.可以创建Serial Dispatch Queue 和Concurrent Dispatch Queue两种队列,Serial Dispatch Queue是等待现在正在执行的Queue,即串行执行 Concurrent Dispatch Queue不等待现在正在执行中的Queue,即并行队列 1.创建Serial Dispatch Queue dispatch_queue_t serialQueue=dispatch_qu

Dispatch Queue

无论编程人员如何努力编写管理线程的代码,在性能方面也不可能胜过XNU内核级所实现的GCD. 使用GCD要比使用pthreads和NSThread这些一般的多线程编程API更好.并且如果使用GCD就不必编写为操作线程反复出现的类似的源代码(这被称为固定源代码片断),而可以在线程中集中实现处理内容,真的是好处多多.我们尽量多使用GCD或者使用了Cocoa框架GCD的NSOperationQueue类等API.

iOS多线程编程之GCD的使用

什么是线程呢? 1个CPU执行的CPU命令列为一条无分叉的路径即为线程. 这种无分叉路径不止1条,存在多条时即为多线程. 什么是GCD? Grand Central Dispatch (GCD)是异步执行任务的技术之一.一般将应用程序中计述的线程管理用的代码在系统级中实现.开发者只需要定义想执行的任务并追加到Dispatch Queue中,GCD就能生成必要的线程并计划执行任务. dispatch_async(queue, ^{ /* *长时间处理 *例如访问数据库 */ /* *长时间处理结束