浅谈GCD的内部实现

CGD

GCD是苹果开发的多线程编程的解决方案,通过简单的API就可以实现创建新线程去执行我们需要执行的任务,不需要我们手动地创建和管理线程。它的API包含在libdispatch库中。

Dispatch Queue

Dispatch Queue是GCD中很重要的一部分,它是负责执行处理的队列,它的内部主要由三部分构成:
1、一个管理追加block的C语言实现的FIFO的队列;
2、处理信号量的原子操作;
3、用于管理线程的C语言实现的一些容器。

1
2
3
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        NSLog(@"我的操作");
    });

dispatch queue 通过 dispatch_async等函数将block追加到队列上,block不是直接追加到队列,而是先构成一个dispatch continuation构造体,构造体包含了这个block还有一些上下文信息,例如block所属的dispatch group等等。

Dispatch Queue执行过程是怎么的呢?

workqueue

工作队列,是一个用于创建内核线程的接口,通过它创建的内核线程来执行内核其他模块排列到队列里的工作。不同优先级的dispatch queue对应着对应优先级的workqueue。GCD初始化的时候,使用pthread_workqueue_create_np创建pthread_workqueue

执行过程

dispatch queue执行block时,先从dispatch queue自身的FIFO队列中取出dispatch continuation,接着调用pthread_workqueue_additem_np函数,传入这些参数:dispatch queue自身、一个符合其优先级workqueue,dispatch continuation。
调用该函数后,会通知对应的workqueue增加执行项目,XNU内核生成线程,线程执行pthread_workqueue函数执行block。

Comments