您的位置 首页 > 数码极客

【gcd是什么意思】什么是GCD

Gcd的优点

Gcd是苹果面向多核并行计算的解决方案

Gcd会自动利用更多CPU核心(例如双核心四核心)

Gcd自动管理线程的生命周期(创建线程保留任务删除线程)

程序员只需要告诉gcd要做什么,不需要写线程管理代码。

Gcd的两项核心工作

任务:要执行的任务

队列:准备作业

Gcd使用的两个阶段

创建任务:确定要执行的任务

向队列添加任务

Gcd会自动从队列中取出任务,然后在该线程上运行

工作检出遵循队列的FIFO原则,即先进先出、后进先出。

//1。创建队列

dispatch _ queue _ tqueue=dispatch _ get _ global _ queue(0,0);

//2。创建作业

Dispatch _ block _ t task={

Nslog (@' hello% @ ',[ns thread current thread]);

}

//3。异步执行

Dispatch_async(queue、task);

dispatch _ async(dispatch _ get _ global _ queue(0,0),{

Nslog (@' hello% @ ',[ns thread current thread]);

});

//异步执行下载打开网页图片

dispatch _ async(dispatch _ get _ global _ queue(0,0),{

ns URL * URL=[nsurl urlwithstring : @ ' '];

ns dat a* data=[nsdata datawithcontentsofurl : URL];

ui image * image=[ui image imagewithdata 3360 data];

//返回到主线程序更新UI

dispatch _ sync(dispatch _ get _ main _ queue(),{

self . image view . image=image;

[self . image view size tofit];

self . scroll view . content size=image . size;

});

});

Gcd队列可分为两大类

并发队列

可以同时运行多个任务(自动打开多个线程并同时运行任务)

并发功能仅在异步函数中有效

串行队列

逐个执行任务(一个任务运行完成后执行下一个任务)

确定是否同步/异步打开新线程

同步:无法在当前线程上执行操作和打开新线程

异步:允许您在新线程上执行操作和打开新线程

并发和串行操作决定了作业的执行方式

并发:同时运行多个任务

串行:一个作业运行完成后,将执行以下操作

串行队列的同步执行将按顺序执行,而不打开新的线程任务

//1。串行队列的并发执行串行端口的含义

dispatch _ queue _ t queue=dispatch _ queue _ create(' hello ',dispatch _ queue _ serial);

Dispatch _ sync (queue,{

Nslog (@' hello% @ ',[ns thread current thread]);

});

执行多个任务时

dispatch _ queue _ t queue=dispatch _ queue _ create(' hello ',dispatch _ queue _ serial);

for(int I=0;i5;I ){

Dispatch _ sync (queue,{

Nslog (@' hello% d% @ ',I,[ns thread current thread]);

});

}

//2。序列伫列的非同步执行开启一个新执行绪工作。依序执行

dispatch _ queue _ t queue=dispatch _ queue _ create(' hello ',dispatch _ queue _ serial);

for(int I=0;i5;I ){

Dispatch _ async (queue,{

Nslog (@' hello% d% @ ',I,[ns thread current thread]);

});

}

//1。运行并行队列同步

Dispatch_queue_t queue=dispatc

h_queue_create("hello", DISPATCH_QUEUE_CONCURRENT);

for (int i=0; i<10; i++) {

dispatch_sync(queue, ^{

NSLog(@"hello %d --%@",i,[NSThread currentThread]);

});

}

//2.并行队列的异步执行开多个线程无序执行

dispatch_queue_t queue = dispatch_queue_create("hello", DISPATCH_QUEUE_CONCURRENT);

for (int i=0; i<10; i++) {

dispatch_async(queue, ^{

NSLog(@"hello %d --%@",i,[NSThread currentThread]);

});

}

主队列

主队列,异步任务

不开线程,同步执行

主队列特点,如果主线程正在执行代码暂时不调度任务,等主线程执行结束后在执行任务

主队列又叫 全局串行队列

主队列,同步执行

程序执行不出来(死锁)

死锁的原因,当程序执行到下面这段代码的时候

主队列:如果主线程正在执行代码,就不调度任务

同步执行:如果第一次任务没有执行,就继续等待第一个任务执行完成,在执行下一个任务时互相等待,程序无法往下执行(死锁)

//1.主队列,异步执行主线程顺序执行

//主队列的特点:先执行完主线程上的代码,才会执行主队列中的任务

for (int i=0; i<10; i++) {

dispatch_async(dispatch_get_main_queue(), ^{

NSLog(@"hello %d----%@",i,[NSThread currentThread]);

});

}

//2.主队列,同步执行----主线程上才会死锁

//同步执行:会等着第一个任务执行完成,才会继续往后执行

for (int i=0; i<10; i++) {

//死锁

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"hello %d----%@",i,[NSThread currentThread]);

});

}

主队列和串行队列

主队列和串行队列的区别

串行队列:必须等待一个任务执行完成,在调度另一个任务

主队列:以先进先出调度任务,如果主线程上有代码在执行,主队列不会调度任务

(主队列,同步执行)放入异步执行 解决死锁

//解决死锁的问题

dispatch_async(dispatch_get_global_queue(0, 0), ^{

for (int i=0; i<10; i++) {

//死锁

dispatch_sync(dispatch_get_main_queue(), ^{

NSLog(@"hello %d----%@",i,[NSThread currentThread]);

});

}

});

全局队列的本质就是并发队列

//全局队列和并发队列的区别

/*

*并发队列有名称,可以跟踪错误,全局队列没有

*在ARC中不需要考虑释放内存,dispatch_release(q),不允许调用

在MRC中需要手动释放内存,并发队列是create创建出来的,在MRC中见到Create就要release,全局队列不需要release(只有一个)

一般我们使用全局队列

*/

/*

同步任务的特点

队列调度多个异步任务前,指定一个同步任务,让所有的

异步任务都等待同步任务完成,这就是所谓的依赖关系

*/

关于作者: admin

无忧经验小编鲁达,内容侵删请Email至wohenlihai#qq.com(#改为@)

热门推荐