前言
上一篇文章讲的多线程的定义以及应用简介,此篇重点探索多线程在项目中使用的最多的方式Grand Central Dispatch
简称:GCD
GCD定义
GCD:将任务添加到队列,并且指定执行任务的函数
全称:Grand Central Dispatch,纯 C 语言,提供了非常多强大的函数
优势
:
1.是苹果公司为多核的并行运算提出的解决方案
2.GCD 会自动利用更多的CPU内核(比如双核、四核)
3.GCD 会自动管理线程的生命周期(创建线程、调度任务、销毁线程)
4.使用者只需要告诉 GCD 想要执行什么任务,不需要编写任何线程管理代码
函数分类
1.异步 dispatch_async
->
不用等待
当前语句执行完毕,就可以执行下一条语句,会开启线程执行 block 的任务,异步是多线程的代名词
2.同步 dispatch_sync
->必须等待当前语句执行完毕
,才会执行下一条语句,不会开启线程
在当前执行 block 的任务
队列
1.串行队列
一次只能执行一个任务
2.并发队列
一次可以执行多个任务
注意:
当前任务是在线程中执行的。
通过队列,调度任务,依赖线程池去只执行任务,并且都会准遵循一个FIFO
,先进来先调度原则。
函数与队列
1、同步函数串行队列
不会开启线程,在当前线程中执行任务,任务串行执行,会产生堵塞。
2、同步函数并行队列
不会开启线程,在当前线程汇总执行任务,任务一个接一个
3、异步函数串行队列
开启一条新线程。任务一个接一个
4、异步函数并行队列
开启线程,在当前线程执行任务,任务异步执行,没有顺序,CPU调度有关。
主队列与全局队列
主队列
:专⻔用来在主线程上调度任务的串行队列
不会开启线程 如果当前主线程正在有任务执行,那么无论主队列中当前被添加了什么任务,
都不会被调度 dispatch_get_main_queue()
;
全局并发队列
:为了方便程序员的使用,苹果提供了全局队列 dispatch_get_global_queue(0, 0)
全局队列是一个并发队列
在使用多线程开发时,如果对队列没有特殊需求,在执行异步任务时,可以直接使用全局队列
死锁现象
定义:
主线程因为同步函数的原因等着先执行任务,主队列等着主线程的任务执行完毕再执行自己的任务,主队列和主线程相互等待会造成死锁
GCD之栅栏函数dispatch_barrier
GCD栅栏函数dispatch_barrier
:拦截前面的并发任务, 等待栅栏函数执行完后 ,再执行后面的并发任务。
警告
:栅栏函数不能使用全局队列(global_queue)
dispatch_barrier_async
与 dispatch_barrier_sync
的区别:
同步栅栏函数
会等待栅栏函数内的任务执行完,再执行后面的主线程或者子线程任务。
异步栅栏函数
不会等待栅栏函数内任务执行完,就会执行后面主线程的任务。
异步栅栏函数不会阻塞主线程。
线程死锁
是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。