Threading Programming Guide
2011-11-28 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [1]
目录
多线程编程指南 ................................................................................................................................................ I
简介 ................................................................................................................................................................... 1
本文档结构............................................................................................................................ 1
第一章 关于多线程编程 .......................................................................................................................... 2
1.1 什么是多线程 ............................................................................................................ 2
1.2 线程术语 .................................................................................................................... 3
1.3 多线程的替代方法 .................................................................................................... 3
1.4 线程支持 .................................................................................................................... 5
1.4.1 线程包 ............................................................................................................. 5
1.4.2 Run Loops ....................................................................................................... 6
1.4.3 同步工具 ......................................................................................................... 6
1.4.4 线程间通信 ..................................................................................................... 7
1.5 设计技巧 .................................................................................................................... 8
1.5.1 避免显式创建线程 ......................................................................................... 8
1.5.2 保持你的线程合理的忙 ................................................................................. 9
1.5.3 避免共享数据结构 ......................................................................................... 9
1.5.4 多线程和你的用户界面 ................................................................................. 9
1.5.5 了解线程退出时的行为 ............................................................................... 10
1.5.6 处理异常 ........................................................................................................ 11
1.5.7 干净地中断你的线程 .................................................................................... 11
1.5.8 线程安全的库 ................................................................................................ 11
第二章 线程管理 .................................................................................................................................... 13
2.1 线程成本 .................................................................................................................. 13
2.2 创建一个线程 .......................................................................................................... 14
2.2.1 使用 NSThread.............................................................................................. 14
2.2.2 使用 POSIX 的多线程 ................................................................................. 16
2.2.3 使用 NSObject 来生成一个线程 ................................................................. 18
2.2.4 使用其他线程技术 ....................................................................................... 18
2.2.5 在 Cocoa 程序上面使用 POSIX 线程 ......................................................... 19
2.3 配置线程属性 .......................................................................................................... 19
2.3.1 配置线程的堆栈大小 ................................................................................... 20
2.3.2 配置线程本地存储 ....................................................................................... 20
Threading Programming Guide
2011-11-28 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [2]
2.3.3 设置线程的脱离状态 ................................................................................... 21
2.3.4 设置线程的优先级 ....................................................................................... 21
2.4 编写你线程的主体入口点 ...................................................................................... 22
2.4.1 创建一个自动释放池(Autorelease Pool) ................................................ 22
2.4.2 设置异常处理 ............................................................................................... 23
2.4.3 设置一个 Run Loop ...................................................................................... 23
2.5 中断线程 .................................................................................................................. 24
第三章 RUN LOOPS ............................................................................................................................. 26
3.1 RUN LOOP 剖析 ........................................................................................................ 26
3.1.1 Run Loop 模式 ............................................................................................. 27
3.1.2 输入源 ........................................................................................................... 28
3.2 何时使用 RUN LOOP ................................................................................................ 33
3.3 使用 RUN LOOP 对象 ............................................................................................... 34
3.3.1 获得 Run Loop 对象 ..................................................................................... 34
3.3.2 配置 Run Loop .............................................................................................. 34
3.3.3 启动 Run Loop .............................................................................................. 36
3.3.4 退出 Run Loop .............................................................................................. 38
3.3.5 线程安全和 Run Loop 对象 ......................................................................... 38
3.4 配置 RUN LOOP 的源 ............................................................................................... 39
3.4.1 定义自定义输入源 ....................................................................................... 39
3.4.2 配置定时源 ................................................................................................... 45
3.4.3 配置基于端口的输入源 ............................................................................... 46
第四章 线程同步 .................................................................................................................................... 57
4.1 同步工具 .................................................................................................................. 57
4.1.1 原子操作 ....................................................................................................... 57
4.1.2 内存屏障和 Volatile 变量 ........................................................................... 58
4.1.3 锁 ................................................................................................................... 58
4.1.4 条件 ............................................................................................................... 59
4.1.5 执行 Selector 例程 ........................................................................................ 60
4.2 同步的成本和性能 .................................................................................................. 60
4.3 线程安全和信号量 .................................................................................................. 61
4.4 线程安全设计的技巧 .............................................................................................. 62
4.4.1 完全避免同步 ............................................................................................... 62
4.4.2 了解同步的限制 ........................................................................................... 62
4.4.3 注意对代码正确性的威胁 ........................................................................... 62
4.4.4 当心死锁(Deadlocks)和活锁(Livelocks) ................................................ 64
4.4.5 正确使用 Volatile 变量 ................................................................................. 65
Threading Programming Guide
2011-11-28 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [3]
4.5 使用原子操作 .......................................................................................................... 65
4.6 使用锁 ...................................................................................................................... 67
4.6.1 使用 POSIX 互斥锁 ..................................................................................... 68
4.6.2 使用 NSLock 类 ............................................................................................ 68
4.6.3 使用@synchronized 指令 ............................................................................. 69
4.6.4 使用其他 Cocoa 锁 ....................................................................................... 70
4.7 使用条件 .................................................................................................................. 73
4.7.1 使用 NSCondition 类 .................................................................................... 73
4.7.2 使用 POSIX 条件 ......................................................................................... 74
附录 A:线程安全总结 ................................................................................................................................. 76
COCOA ................................................................................................................................. 76
基础框架(Fondation Framework)的线程安全 ........................................................ 76
Application Kit 框架的线程安全 .................................................................................. 82
Core Data 框架 .............................................................................................................. 84
CORE FOUNDATION(核心框架) ...................................................................................... 84
术语表 ............................................................................................................................................................. 86
结束语 ............................................................................................................................................................. 88
推荐资源 ......................................................................................................................................................... 89
Threading Programming Guide
2011-11-28 | © 2011 YouMi Mobile Co. Ltd. All Rights Reserved. [1]
简介
线程是单个应用中可以并发执行多个代码路径的多种技术之一。虽然更新的技术
如操作对象(Operation objects)和 Grand Central Dispatch(GCD),提供一个更
加现代化和高效率的基础设施来实现多核并发,但是 Mac OS X 和 iOS 也提供一套接
口来创建和管理线程。
本文档介绍了 Mac OS X 上面的可用线程包,并且演示如何使用它们。本文档还
描述了在你的应用中多线程代码同步的相关技术。
重要:如果你正在创建一个新的应用程序,我们鼓励你研究 Mac OS X 上面实现并发的替代
方法。如果还没有熟悉掌握需要实现一个多线程应用的设计技术的话,我们更鼓励你那样做。这
些替代方法简化了大量原本你需要实现来执行并发路径的工作,并且提供了比传统线程更好的性
能。获取更多相关技术的信息,你可以查阅
Concurrency Programming Guide
。
本文档结构
本篇文档包含了以下章节和附录:
“关于多线程编程”介绍了多线程的概念和它们在应用设计里面的角色。
“线程管理”提供了关于 Mac OS X 上面线程技术的相关信息,并且教你如果
使用它们。
“Run Loops” 提供有关如何管理在辅助线程中的循环事件处理的信息。
“同步(Synchronization)” 介绍同步问题和你可以用于阻止多线程破坏你
的数据或者导致你程序崩溃的工具。
“线程安全总结” 提供了 Mac OS X 和 iOS 上面固有的线程安全的高度总结
和它们的主要框架