GCD
Posted LLLLLuke
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了GCD相关的知识,希望对你有一定的参考价值。
GCD:全称Grand Central Dispatch (伟大的中央调度) 纯C语言 提供了非常强大的函数
优势:
1.GCD 是苹果为多核的并行运算提供的解决方案
2.会自动的管理线程的生命周期(创建线程,调度任务,销毁线程)
3.只需要告诉GCD执行什么就可以了,不用编写任何管理线程的(线程数是由GCD来决定的)
核心:
任务:执行什么操作
队列:用来存放什么任务
创建GCD的步棸:
创建任务
将任务添加到队列中(GCD会自动的将队列中的任务取出来,放到对应的线程中去执行,任务的取出遵循FIFO(队列)原则:先进先出,后进后出)
串行队列:让任务一个一个的去执行,一个执行完去执行下一个 并行队列:可以让多个任务去并发执行 只在异步函数下有效 // 创建队列 1.串行队列: dispatch_queue_t queen =dispatch_queue_create("test",DISPATCH_QUEUE_SERIAL); 2.并行队列 dispatch_queue_t queen =dispatch_queue_create("test",DISPATCH_QUEUE_CONCURRENT); //创建任务 dispatch_block_t task1=^{ [NSThread sleepForTimeInterval:1.0]; NSLog(@"task1 %@",[NSThread currentThread]); }; // 把任务添加到队列中 1.异步执行 dispatch_async(queen, task1); 2.同步执行 dispatch_async(queen, task1); 同步和异步决定了要不要去开辟新的线程 同步:在当前线程中去执行任务 不具备开启线程的能力
串行同步:不开启新线程,任务依次执行
串行异步:开启新线程,任务依次执行
并行同步:不开启新线程,任务依次执行
并行异步:开启新线程,任务并发执行
全局队列:dispatch_get_global_queue(<#long identifier#>, <#unsigned long flags#>)(是并发队列的一种)
全局同步:不开启新线程,任务依次执行
全局异步:开启新线程,任务并发执行
主队列:dispatch_get_main_queue()(串行队列的一种)(这个队列上的任务在主队列中进行)
主队异步:不开启新线程,任务顺序执行
主队同步:(造成死锁)原因:主线程执行任务从上向下一次执行,当到这个地方时,主线程等待去执行这个主队列的任务,主队列的任务等待着主线程空闲下来,把任务放进去,造成相互等待
解决:
// 开辟新的线程 解放路主线程.
dispatch_async(dispatch_get_global_queue(0, 0), ^{
dispatch_sync(dispatch_get_main_queue(), ^{
[NSThread sleepForTimeInterval:1.0];
NSLog(@"%@ task1",[NSThread currentThread]);
});
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"%@ task2",[NSThread currentThread]);
});
});
其余用法: // 延迟加载 模拟网络延迟 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ // 要执行的代码块 }); // 一次加载 /* 1.一次执行线程是安全的 2.与互斥锁相比 安全性是比较高的 3,一般会用来单例上 */ for (int i=0; i<100000; i++) { static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ NSLog(@"s"); onceToken=0; }); // 调度组: dispatch_group_async(group, dispatch_get_global_queue(0, 0), ^{ NSLog(@"%@",[NSThread currentThread]); dispatch_sync(dispatch_get_global_queue(0, 0), ^{ NSLog(@"下载第一首歌 %@", [NSThread currentThread]); }); dispatch_sync(dispatch_get_global_queue(0, 0), ^{ NSLog(@"下载第2首歌 %@", [NSThread currentThread]); }); dispatch_sync(dispatch_get_global_queue(0, 0), ^{ NSLog(@"下载第3首歌 %@", [NSThread currentThread]); }); }); // 如果组里面的任务执行完毕 通知执行下面的代码 dispatch_group_notify(group, dispatch_get_main_queue(), ^{ NSLog(@"下载完成"); });
同步任务: dispatch_async(dispatch_get_global_queue(0, 0), ^{ dispatch_sync(dispatch_get_global_queue(0, 0), ^{ NSLog(@"1 %@",[NSThread currentThread]); }); dispatch_sync(dispatch_get_global_queue(0, 0), ^{ NSLog(@"2 %@",[NSThread currentThread]); }); dispatch_async(dispatch_get_global_queue(0, 0), ^{ NSLog(@"3 %@",[NSThread currentThread]); }); });
以上是关于GCD的主要内容,如果未能解决你的问题,请参考以下文章