GCD 多线程

DispatchQueue(简称 GCD) 是 iOS 提供的一套允许代码以多核并发的方式执行程序的一种执行方式。

同步和异步的区别在于线程会等待同步任务执行完成,而线程不会等待异步任务执行完成,而同步和异步任务则是用 syn{ } 和 asyn { } 代码块涵盖的内容。

除此之外,GCD 还会通过两种队列(串行并发)来管理和决定其执行的顺序。串行的状态下,任务会按照队列的顺序一个一个地运行。而在并发的状态下,任务则会快速切换实现“伪同步”运行的效果。

以 GCD 为对象深入了解 iOS 多线程

  • 串行异步

会开启新的线程,按照顺序并一个一个完成任务

  • 串行同步

不会开启新的线程,同样是一步一步地完成任务,要求先执行对应的任务

  • 并行异步

会开启新的线程,并行操作多线程执行任务,任务交替执行

  • 并行同步

不会开启新的线程,所以等执行完一个任务才会执行下一个任务,会导致死锁

  • 主队列同步

在这种场景下,会导致死锁的产生,因为将新的任务添加到主队列中意为着主队列得先完成自己的任务才能完成新的任务,但由于同步,要求得先执行新的任务再执行主队列自己的任务,所以两个产生冲突,导致队列阻塞,导致死锁。

在取消网络请求的应用场景,可以直接在主队列添加任务,而不需要使用并行队列,因为倒计时的任务量不大,在每秒内都可以执行完毕,不会导致主线程拥塞。

GCD 提供几种多线程调用的方法:

  • dispatch_after

倒计时结束后,将block的任务添加到指定的任务队列去里面去

  • dispatch_once

用于执行单例模式

  • dispatch_block

用于实现一个 block 对象,可以方便后续的函数调用 block

  • dispatch_group

用于分组管理异步代码,包括以下三种用法:

  • notify (依赖)

可用于判断组内任务是否完成

  • wait (等待)

可用于等待任务完成

  • enter / group (手动管理计数)

手动添加/减少组内任务,必须一一对应

  • dispatch_semaphore

用于实现线程同步和加锁,同样是三种方法

  • create:用于控制并发数
  • wait:对应信号量的 P 操作,即请求资源,当 > 0 的时候会 – 1, < 0 的时候会等待
  • signal:对应信号量的 V 操作,即释放资源, + 1,可用于唤醒其他线程

可以用于监视某些事情的发生

参考

实操 https://leylfl.github.io/2018/01/16/%E6%B5%85%E8%B0%88iOS%E5%A4%9A%E7%BA%BF%E7%A8%8B-%E4%BD%BF%E7%94%A8%E7%AF%87/

样例:https://juejin.cn/post/6844903766701916168

发表评论

邮箱地址不会被公开。 必填项已用*标注