iOS学习之——多线程编程

一个CPU一次只能执行一个命令,不能执行某处分开的并列的两个命令,因此通过CPU执行的CPU命令行就好比一条无分叉的大道,其执行不会出现分歧。
“一个CPU执行的CPU命令列为一条无分叉路径”即为线程.
现在一个物理的CPU芯片实际上有64个(64核)CPU,如果一个CPU核虚拟为两个CPU核工作,那么一台计算机上使用多个CPU核就是理所应当的事了。尽管如此”一个CPU执行的CPU命令列为一条无分叉路径”仍然不变。
这种无分叉路径不只一条,存在有多条时即为”多线程”。在多线程中,1个CPU核执行多条不同路径上的不同命令。
OS X和IOS的核心XNU内核在发生操作系统时间时(如每隔一定时间,唤起系统调用等情况)会切换执行路径。执行中路径的状态,例如CPU的寄存器等信息保存在各自路径专用的内存块中,从切换目标路径专用的内存块中,复原CPU寄存器等信息,继续执行切换路径的CPU命令列。这被称为”上下文切换”。
由于使用多线程的程序可以在某个线程和其他线程之间反复多次进行上下文切换,因此看上去就好像1个CPU核能够并列地执行多个线程一样。而且在具有多个CPU核的情况下,就不是”看上去像”了,而是真的提供了多个CPU核并行执行多个线程的技术。
这种利用多线程编程的技术就被称为”多线程编程”。
但是,多线程编程实际上是一种易发生各种问题的编程技术。比如多个线程更新相同的资源会导致数据的不一致(数据竞争)、停止等待事件的线程会导致多个线程相互持续等待(死锁)、使用太多线程会消耗大量内存等。

尽管极易发生各种问题,也应当使用多线程编程。这是为什么呢?因为使用多线程编程可保证应用程序的响应性能。
应用程序在启动时,通过最新执行的线程,即”主线程”来描绘用户界面、处理触摸屏幕的事件等。如果在该主线程中进行长时间的处理,如AR用画像的识别或数据库访问,就会妨碍主线程的执行(阻塞)。在OS X和iOS的应用程序中,会妨碍主线程中被称为RunLoop的主循环的执行,从而导致不能更新用户界面、应用程序的画面长时间停滞等问题。这就是长时间的处理不在主线程中执行而在其他线程中执行的原因。
使用多线程编程,在执行长时间的处理时仍可保证用户界面的响应性能。

你可能感兴趣的:(多线程,ios,线程,cpu)