小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
线程安全问题
多线程是个好东西,但是我们在使用的过程中也要注意。多线程访问同一块资源时,容易发生数据错乱和数据安全问题。
互斥锁(sync)
锁的范围小,效率越高;锁对象要保证所有线程都能访问; 如果有线程正在执行,其他线程就会休眠。
自旋锁(atomic)
在获取锁之前,一直处于忙等状态;占用CPU资源。 锁的持有时间短,且线程不希望在重新调度上花太多成本时,就会用自旋锁。
目前已经不安全了,因为会出现优先级反转问题。
系统在调度线程的时候,会存在优先级,如果等待锁的线程优先级比较高,就会出现一直占用CPU资源,优先级低的。
多读单写
可以同时读取,但是在写入的时候会加锁。
多线程方案
| 技术方案 | 平台性 | 语言 | 线程生命周期 | 使用频率 |
|---|---|---|---|---|
| Pthread | 跨平台、可移植。使用难度大 | C语言 | 开发人员管理 | 几乎不用 |
| NSThread | 使用更加面向对象。简单易用,可直接操作线程对象 | Objective-C | 开发人员管理 | 偶尔使用 |
| GCD | 旨在代替NSThread等线程技术;充分利用线程的多核 | C语言 | 自动管理 | 经常使用 |
| NSOperation | 基于GCD的封装,更加面向对象,使用方便。多了一些简单实用的功能 | Objective-C | 自动管理 | 经常使用 |
线程通信:
- 消息传递,perforamSelector
- 全局变量,共享内存和对象
- 条件执行
- runloop sources
- port and socket
- 消息队列
- Cocoa 分布式对象