iOS 多线程(二):GCD

💡 原文中文,约12200字,阅读约需29分钟。
📝

内容提要

GCD是苹果公司为多核并行运算提出的解决方案,能够主动利用更多的CPU内核,程序员只需告诉GCD想要执行什么任务,不需要编写线程管理代码。GCD有同步异步和串行并发两种任务执行方式,可以组合使用。GCD还有其他用法,如栅栏函数、调度组、信号量、dispatch_once和dispatch_apply等。其中,dispatch_source常用于GCD定时器的实现。

🔎

延伸解读

同步与异步的核心区别

同步任务会在当前线程执行,任务未完成时会阻塞线程,且不会开启新线程;异步任务则具备开启新线程的能力,可以在新线程中执行。这一区别决定了任务是否等待以及是否并发,是理解GCD任务调度的基础。

串行与并发队列的行为差异

串行队列只开启一个线程,任务按FIFO顺序一个接一个执行;并发队列可以开启多个线程,同时执行多个任务。但并发队列的并发能力仅在异步(dispatch_async)方式下有效,同步提交到并发队列仍会顺序执行。

栅栏函数的使用要点

栅栏函数用于确保一组任务完成后才执行下一组,适合控制并发队列中的任务顺序。它必须用于自定义的并发队列,且同一队列中才有效。dispatch_barrier_async不会阻塞当前线程,而dispatch_barrier_sync会阻塞,应尽量少用。

GCD定时器与NSTimer的精度对比

NSTimer依赖Runloop,当Runloop运行在其他模式或阻塞时,定时器可能挂起或延迟,导致计时误差。GCD定时器基于dispatch_source,不依赖Runloop,因此计时精度更高,适合对时间准确性要求较高的场景。

❓

Q&A

GCD的主要功能是什么?

GCD是苹果公司为多核并行运算提出的解决方案,能够主动利用更多的CPU内核,简化线程管理。

GCD中同步和异步的区别是什么?

同步执行会阻塞当前线程,直到任务完成;异步执行则在新线程中执行任务,不会阻塞当前线程。

什么是GCD的栅栏函数,它有什么作用?

栅栏函数用于控制任务的执行顺序,确保一组任务完成后再执行另一组任务,适用于并发队列。

GCD如何实现任务的分组执行?

GCD使用调度组来将任务分组执行,并可以监听任务组的完成情况。

GCD中的信号量有什么用途?

信号量用于控制GCD的最大并发数,也可以作为锁使用,确保线程安全。

dispatch_once的作用是什么?

dispatch_once确保某段代码在程序运行过程中只被执行一次,适用于单例模式和线程安全的场景。

🏷️

标签

➡️

继续阅读