iOS 多线程(二):GCD
内容提要
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确保某段代码在程序运行过程中只被执行一次,适用于单例模式和线程安全的场景。