<p>大部分现在操作系统(包括 iOS) 都支持执行线程的概念, 每个进程可以包含多个线程, 它们可以同时运行. 如果只有一个处理器核心, 操作系统将会在所有执行线程之间切换, 非常类似于在所有执行进程之间切换. 如果拥有多个核心, 线程就像进程一样, 分散到几个核心上去执行.</p>
<p>一个进程中的所有线程共享可执行程序代码和全局数据. 每个线程也可以拥有一些独有的数据. 线程可以使用一种称为互斥量(mutex)或锁的特殊结构, 这种结构可以确保特定的代码块无法一次被多个线程运行. 在多个线程同时访问相同数据时, 这有助于保障正确的结果, 在一个线程更新某个值(在代码中称为临界区)是锁定其他线程.</p>
<p>处理线程的过程中我们通常会关注线程安全(thread safe)问题. 一些软件库在编写时考虑了线程并发性, 并使用互斥量恰当的保护它们的所有临界区, 也有一些代码库不是线程安全的.</p>
<p>举例来说, 在 Cocoa Touch 中, Foundation 框架(包含适用于所有 Objective-C 编程类型的基本类, 如 NSString, NSArray等)通常被视为是线程安全的, 但是, UIKit 框架(包含专门用于构建 GUI 应用的类, 如 UIApplication, UIView 及其所有子类等)在很大程度上被视为非线程安全的. 这意味着在一个运行的 iOS 应用中, 处理任何 UIKit 对象的所有方法调用都应从相同线程执行, 该线程通常称为<b>主线程( main thread)</b>. 如果从另一个线程访问 UIKit 对象, 那结果就不堪设想了! 你还可能会遇到一些莫名其妙的 bug, 甚至更糟的是, 你自己不会遇到任何问题, 但发布只有一些用户却遭殃了.</p>
<p>默认情况下, 主线程执行 iOS 应用的所有操作(比如处理由用户事件触发的操作), 所以对于简单应用, 没有什么需要担心的. 用户触发的动作方法已在主线程运行</p>
网友评论