15、同步与线程:原子操作与锁机制详解

同步与线程:原子操作与锁机制详解

1. 原子操作

在多线程编程中,竞态条件是一个常见的问题。之前的例子中,竞态条件是由于编译器生成一系列指令来对实例变量 retainCount 进行递增和递减操作而导致的。一种解决方案是将编译器生成的加载 - 修改 - 存储序列替换为一条执行等效操作的单指令,这样在执行被其他线程抢占时,操作就不会被中断。但实际上,并非总能用单指令替换操作,因此我们使用一系列表现得像单指令一样的指令,这就是“原子”操作,因为操作结果就好像指令序列作为一个不可分割的整体执行一样。

原子操作的实现需要 CPU 的支持。例如,Macintosh 计算机使用的 Intel CPU 提供了一条指令,可将一个值原子地加到内存中的另一个值上。但在多处理器环境中,仅靠这一点还不足以使操作成为原子操作,所以 Intel 指令集提供了 LOCK 前缀,可防止系统中的其他 CPU 在指令执行时访问内存。由于原子操作的实现依赖于特定的 CPU 架构支持,使用 ARM 指令集的 iOS 设备对每个原子操作都需要不同的实现。

为了便于在驱动代码中访问原子操作,I/O 套件包含了许多函数,用于提供基本操作的原子实现,如整数加法、值的递增和递减以及位操作。这些函数在 <libkern/OSAtomic.h> 头文件中定义,具体如下表所示:

函数 描述
OSIncrementAtomic(address);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值