这是我参与「第四届青训营」笔记创作活动的第6天
一、本堂课重点内容:
二、详细知识点介绍:
多线程基础概念
进程与线程
进程:程序运行的一个实例,是资源分配的最小单位,独立地运行在其专用受保护的内存空间内
线程:一个进程可以包含多个线程,线程是操作系统实施调度的最小单位
每个线程之间共享进程的内存空间(代码段、数据段、堆等)及一些进程级的资源(如打开文件等)
每个线程有寄存器、栈、线程局部存储(TLS)等私有数据
串行、并行、并发
串行:任务有序地一个一个地执行,前一个任务执行完之后才能执行下一个任务
并行:多个任务在同一时刻被执行
并发:多个任务在同一时间段内需要被执行,侧重点是这个现象的“发生”
以核酸检测队伍为例,如何理解这些概念?
串行:前一个人做完了,下一个人才能做
并行:拍成几队,同时做
并发:排成几队,一个人做,A队做一个,B队做一个,依次...多线程编程又称为并发编程,让多个 CPU 并发处理多个线程的指令,从而提高程序的执行效率
线程生命周期与线程调度
线程的生命周期:包括新建、就绪、运行、阻塞、死亡五种状态
线程调度:当在单个处理器上运行多个线程,操作系统会让这些线程轮流执行一小段时间,宏观上“看起来”这些线程是同时执行的。不断地在处理器上切换不同线程的行为称为线程调度。
RunLoop 和主线程
RunLoop: 是事件接收和分发机制的一个实现,可以让线程在适当的时间处理任务不会退出。iOS App中,主线程的 RunLoop 在程序运行时就会启动,其他线程的 RunLoop 需要手动开启。RunLoop 的基本作用有:保持程序持续运行、处理程序中的各种事件、节省 CPU 资源提高程序性能,在必要的时候线程会被唤醒进行工作,否则会进入休眠,休眠时不占用 CPU。
主线程: iOS App 启动时默认会开启一条线程,称为“主线程”。主线程默认开启 RunLoop,使得主线程可以及时刷新 UI 界面和处理 UI 交互事件(如点击、滑动、拖拽等),所以主线程又称为“UI 线程”。耗时操作会妨碍主线程中的主循环的执行,从而引起 App 卡顿问题。通过多线程编程,将耗时操作放到子线程执行,在必要时再回到主线程做刷新操作,可以使程序运行更加流畅。
多线程编程的优缺点
优点:
- 能适当地提高程序的执行效率
- 能适当地提高资源利用率
缺点:
- 创建线程、线程调度都是有开销成本的,如果开启大量线程,会降低程序的性能
- 需要谨慎处理线程安全问题,增加了程序设计的复杂度
多线程实现方案和GCD
多线程编程方案对比
GCD 接口介绍
任务与队列
串行队列与并行队列
同步执行与异步执行
dispatch_after
dispatch_group
dispatch_apply
dispatch_once
线程安全和同步
原子操作、临界区、线程同步
锁与死锁
atomic、nonatomic
dispatch_barrier_async
dispatch semaphore
应用场景介绍
典型场景
异步请求
耗时操作
线程安全的容器
常见问题
死锁崩溃
非主线程操作UI
线程不安全的容器读写崩溃
三、实践练习例子:
- 有什么实践举例帮助理解知识点?
四、课后个人总结:
因为之前选修过并行开发的课程,因此这些知识点看起来都比较熟悉,易于接受。
-
本章有什么知识点不容易掌握?
-
什么地方容易与其他内容混淆?