OC中的多线程编程 | 青训营笔记

97 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的的第4天

进程与线程

在讲解多线程编程之前,首先介绍进程与线程的区别

进程:程序运行的一个实例,它是操作系统分配资源的基本单元。每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内,拥有独立运行所需的全部资源

线程:线程是操作系统实施调度的最小单位,线程是进程中的一个实体

进程和线程的关系

  • 线程是 CPU 分配资源和调度的最小单位
  • 同一个进程内的线程共享进程资源
  • 线程是进程的执行单元,进程的所有任务都在线程中执行
  • 一个程序可以对应多个进程(多进程),一个进程中可有多个线程,但至少要有一条线程

串行、并行和并发

  • 串行:任务有序地一个个地执行,前一个任务执行完才能执行下一个任务
  • 并行:多个任务在同一时刻执行
  • 并发:多个任务在同一时间段内需要被执行,主要点在于:发生

线程生命周期:

  • 线程的生命周期包含:新建、就绪、运行、阻塞、死亡
  • 线程调度:当在单个处理器上运行多个线程,操作系统会让这些线程轮流执行一小段时间,宏观上“看起来”这些线程是同时执行的。不断地在处理器上切换不同线程的行为称为线程调度

RunLoop和主线程

RunLoop:

  • 是事件接收和分发机制的一个实现,可以让线程在适当的时间处理任务不会退出
  • 保持程序持续运行
  • 处理程序中的各种事件
  • 省 CPU 资源提高程序性能,在必要的时候线程会被唤醒进行工作,否则会进入休眠,休眠时不占用 CPU

主线程:

  • iOS App 启动时默认会开启一条线程,称为“主线程”。主线程默认开启 RunLoop,使得主线程可以及时刷新 UI 界面和处理 UI 交互事件(如点击、滑动、拖拽等)
  • 通过多线程编程,将耗时操作放到子线程执行,在必要时再回到主线程做刷新操作,可以使程序运行更加流畅

队列与同步异步执行

并行队列串行队列(非主队列)主队列
同步执行(dispatch_sync)不开启新线程,在当前线程执行任务不开启新线程,在当前线程串行执行任务发生死锁
异步执行(dispatch_async)会开启新线程,并行执行队列中的任务开启一条新线程,串行执行队列中的任务不开启新线程,在当前线程的下一个runloop执行任务