iOS-多线程之GCD

581 阅读3分钟

前言

上一篇文章讲的多线程的定义以及应用简介,此篇重点探索多线程在项目中使用的最多的方式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_asyncdispatch_barrier_sync的区别:

同步栅栏函数会等待栅栏函数内的任务执行完,再执行后面的主线程或者子线程任务。

异步栅栏函数不会等待栅栏函数内任务执行完,就会执行后面主线程的任务。 异步栅栏函数不会阻塞主线程。

线程死锁

是指两个或两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。