Grand Central Dispatch (GCD)


Grand Central Dispatch (GCD) 是一种适用于 Apple 的 Mac OS X 和 iOS 操作系统的技术,它结合了对 C 语言的扩展、API 和运行时库,使应用程序开发人员能够识别要并行运行的代码段。与 OpenMP 类似,GCD 管理着线程的大部分细节。GCD 识别对 C 和 C++ 语言的扩展,称为块。块只是一个自包含的工作单元。它由插入在一对花括号 { } 前面的插入符号 ˆ 指定。下面显示了一个简单的块示例 -

{
   ˆprintf("This is a block");
}

它通过将块放置在调度队列上安排块在运行时执行。当它从队列中删除一个块时,它会将该块分配给它管理的线程池中的一个可用线程。GCD 识别两种类型的调度队列:串行和并发。放置在串行队列上的块按照 FIFO 顺序删除。一旦一个块从队列中删除,它必须完成执行才能删除另一个块。每个进程都有自己的串行队列(称为主队列)。开发人员可以创建其他特定于进程的串行队列。串行队列可用于确保多个任务的顺序执行。放置在并发队列上的块也按 FIFO 顺序删除,但可以同时删除多个块,从而允许多个块并行执行。有三个系统范围的并发调度队列,它们根据优先级区分:低、默认和高。优先级表示块相对重要性的近似值。简单来说,具有较高优先级的块应该放置在高优先级调度队列中。以下代码段说明了如何获取默认优先级的并发队列,以及如何使用 dispatch_async() 函数将块提交到队列 -

dispatch_queue_t queue = dispatch_get_global_queue
(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch async(queue, ˆ{ printf("This is a block."); });

在内部,GCD 的线程池由 POSIX 线程组成。GCD 积极管理池,允许线程数量根据应用程序需求和系统容量增长和缩小。

更新时间: 2019年10月11日

724 次浏览

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告