大部分现代操作系统,包括IOS,都支持执行线程的概念。每个进程可以包含多个线程,他们可以同时运行。如果只有一个处理器核心,操作系统将在所有执行线程之间切换,非常类似于在所有执行线程之间切换。如果拥有多个核心(核心),线程将像进程一样,分散到多个核心上去执行。
一个进程中的所有线程共享可执行程序代码和全局数据。每个线程也可以拥有一些独有的数据。线程可以使用一种成为互斥量或锁的特殊结构,这种结构可以确保特定的代码块无法一次没多个线程执行。在多个线程同时访问相同数据时,这有助于保证正确的结果,在一个线程更新某个值(在代码中称为临界区)时锁定其他线程。
处理线程的过程中我们通常会关注线程安全(thread-safe)问题。一些软件库在编写时考虑了线程并发性,并使用互斥量恰当地保护他们的所有临界区。也有一些代码库不是线程安全的。
举个例子,IOS的Cocoa Touch中,Foundation框架(包含适用于所有Object-C编程类型的基本类,如NSString、NSArray等)通常被视为线程安全的。但是,UIKit框架(包括专门构建GUI应用的类,如UIApplication、UIView及其所有子类等)是非线程安全的。这意味着一个运行的IOS应用中,处理任何UIKit对象的所有方法调用都应从相同线程执行,该线程称之为主线程-main thread。如果从另一个线程访问UIKit对象,那结果就发生很多意想不到的结果(错误)! --所以,更新UI要在主线程运行。
默认情况下,主线程执行IOS应用的所有操作(比如处理用户时间触发的操作),所以对于简单应用,没有什么需要担心的,用户触发的动作已经(默认)在主线程中运行。
IOS线程理念:
将长期运行的任务拆分为多个工作单元,并将这些单元添加到执行队列中。系统会为我们管理这些队列,为我们在多个线程上执行工作单元。我们不需要直接启动和管理后台线程,而可以从通常实现多线程应用所涉及的太多‘登记’工作中脱离出来,系统为我们完成这些工作。
线程安全问题,可以参照苹果官方文档: