Grand Central Dispatch(GCD)技术让任务并行排队执行,根据可用的处理资源,安排他们在任何可用的处理器核心上执行任务。任务可以是一个函数(function)或者是一个block。 GCD的底层依然是用线程实现,不过这样可以让程序员不用关注实现的细节。
GCD中的队列称为dispatch queue,它可以保证先进来的任务先得到执行通过它能够大大简化多线程编程。工程师只要将要执行的任务(执行代码块)放入队列中,GCD将会为需要执行的任务创建thread,从而放入dispatch queue中,当将任务添加到队列立即安排开始执行。
任务:其是并发程序的执行单位;队列:其是并发程序的管理单位。
第一个程序 Object-C 语言
int main(int argc, const char * argv[]) {
//创建队列
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//添加block任务
dispatch_async(queue, ^{
printf("hello world\n");
});
sleep(2); //若不休眠2秒,主线程就会退出,导致dispatch queue线程也退出。
return 0;
}
输出:
hello world
Dispatch queue的实现机制是基于C实现的,并且GCD自动为用户提供了一些dispatch queue,当然也可以自定义一些queue。其中queue类型只有三种:Serial、Concurrent和Main dispatch queue。
Type |
Description |
Serial(串行) |
又称为private dispatch queues,同一时刻只执行一个任务,并按添加到serial的顺序执行。当创建多个Serial queue时,虽然它们各自是同步执行的,但Serial queue与Serial queue之间是并发执行的。Serial queue通常用于同步访问特定的资源或数据。 |
Concurrent(并行) |
又称为global dispatch queue,同一时刻可执行多个任务,任务开始执行的顺序按添加的顺序执行,但是执行完成的顺序是随机的,同时可以创建执行的任务数量依赖系统条件。 |
Main dispatch queue(主队列) |
它是全局可用的serial queue,它是在应用程序主线程上执行任务的。 |
并行队列
由于系统已经为每个应用程序创建了四个不同优先级的Concurrent dispatch queue,用户不需要创建Concurrent dispatch queue,只需通过dispatch_get_global_queue 函数获得就可以,其声明如下:
dispatch_queue_t dispatch_get_global_queue(long identifier,long flags); |
|
PS:虽然dispatch queue是reference-counted对象,但是由于是全局对象,所以不需要手动进行retain 和 release。