同步与线程:原子操作与锁机制详解
1. 原子操作
在多线程编程中,竞态条件是一个常见的问题。之前的例子中,竞态条件是由于编译器生成一系列指令来对实例变量 retainCount 进行递增和递减操作而导致的。一种解决方案是将编译器生成的加载 - 修改 - 存储序列替换为一条执行等效操作的单指令,这样在执行被其他线程抢占时,操作就不会被中断。但实际上,并非总能用单指令替换操作,因此我们使用一系列表现得像单指令一样的指令,这就是“原子”操作,因为操作结果就好像指令序列作为一个不可分割的整体执行一样。
原子操作的实现需要 CPU 的支持。例如,Macintosh 计算机使用的 Intel CPU 提供了一条指令,可将一个值原子地加到内存中的另一个值上。但在多处理器环境中,仅靠这一点还不足以使操作成为原子操作,所以 Intel 指令集提供了 LOCK 前缀,可防止系统中的其他 CPU 在指令执行时访问内存。由于原子操作的实现依赖于特定的 CPU 架构支持,使用 ARM 指令集的 iOS 设备对每个原子操作都需要不同的实现。
为了便于在驱动代码中访问原子操作,I/O 套件包含了许多函数,用于提供基本操作的原子实现,如整数加法、值的递增和递减以及位操作。这些函数在 <libkern/OSAtomic.h> 头文件中定义,具体如下表所示:
| 函数 | 描述 |
|---|---|
OSIncrementAtomic(address); |
超级会员免费看
订阅专栏 解锁全文
1082

被折叠的 条评论
为什么被折叠?



