iOS-多线程编程学习(一)

iOS开发中对于多线程的支持还是比较完善的,主要包括了四种方式。这里对多线程开发基础概念进行了介绍,并总结了四种实现模式的区别。

基本概念

进程:一个具有独立功能的程序关于某数据集合的一次运行活动。是系统进行资源分配和调度的基本单位。

线程:也被称为轻量级进程,是程序执行流的最小单元。一个标准的线程包括线程ID,当前指令指针(PC),寄存器集合和堆栈。线程是进程的一个实体,是被系统独立调度和分派的基本单位,线程自身不能拥有资源,但是它可以和同属一个进程的其他线程共享所拥有的资源。

同步:同步顾名思义就是协同步调的意思,即协调当前线程按照一定的先后次序依次序执行。而在多线程里,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术(临界区,互斥量,信号量,事件),保证数据在任何时刻,最多只有一个线程访问,以保证数据的完整性。

异步:可以再当前线程开启多个线程执行任务,并且每个线程的任务可以不按顺序执行。

队列:这里特指的用于存储线程任务的队列数据结构。

PS:
一个进程可以有多个线程。
一个线程可以有多个队列。
队列可分为并发队列和串行队列。

并发:线程执行可以同时进行。

串行:线程只能依次逐一先后有序的执行。

主线程:在iOS或安卓程序中,一个程序运行后会默认开启一个线程,称为“主线程”或“UI线程”。其主要作用是负责显示/刷新UI界面,处理UI事件(例如点击事件,滚动事件,拖拽事件等)

##四种实现方式

pthread

  我们都知道OC语言可以看做是C语言的一个“扩展”,所以C语言的多线程特性在OC中同样是可用的。
  pthread就是C语言下的一套通用的多线程API。它的优点就是跨平台和可移植(Unix,Linux,Windows等),但是它的使用难度比较大,而且需要程序员手动进行线程的生命周期管理,所以在实际iOS开发中是几乎不推荐使用的。

NSThread

每个NSThread对象对应一个线程。

  • 优点:NSThread轻量级最低。并且是面向对象的,简单易用,可直接操作线程对象。
  • 缺点:需要手动管理所创建的所有线程活动,包括生命周期,线程同步,线程睡眠等。

NSOperation

自带线程管理的抽象类。

  • 优点:自带线程生命周期管理,操作上可以更注重于业务逻辑的实现。还可以添加任务之间的依赖关系。
  • 缺点:面向对象的抽象类,只能实现它或者使用它的两个子类:NSInvocationOperation和NSBlockOperation。

GCD

Grand Centeal Dispatch(GCD)是Apple提出的一个多核编程的解决方案。

  • 优点:充分利用CPU多核,自动管理线程的生命周期,非常高效,能有效避开并发陷阱。
  • 缺点:基于C实现(WTF?!这也能算缺点?!)…

##多种方法选择总结

  • 简单而安全的使用选择NSOperation即可。
  • 处理大量并发数据,又追求高性能的选择GCD。
  • 其他的两个看心情吧,你想基于它们造轮子倒是不错的选择。

参考资料

  1. iOS开发探索-多线程(NSThread、NSOperation、GCD)编程浅谈