目录

原子操作概述
armasm
; 原子操作三大特性:
; 1. 不可分割性(Atomicity)
; 2. 可见性(Visibility)
; 3. 有序性(Ordering)
应用场景:
- 多核共享资源访问
- 计数器递增
- 标志位修改
独占访问指令
LDXR/STXR工作原理
Core Memory LDXR (加载独占) 返回当前值+标记独占区域 STXR (尝试存储) 返回状态(0=成功/1=失败) Core Memory
指令语法与示例
armasm
// 原子递增示例
atomic_inc:
ldaxr w1, [x0] // 带Acquire语义的加载独占
add w1, w1, #1
stlxr w2, w1, [x0] // 带Release语义的存储独占
cbnz w2, atomic_inc // 失败重试
ret
关键变体:
指令 | 语义 | 屏障类型 |
---|---|---|
LDXR | 普通独占加载 | 无屏障 |
LDAXR | Acquire语义 | 加载屏障 |
STXR | 普通独占存储 | 无屏障 |
STLXR | Release语义 | 存储屏障 |
自旋锁实现
基础自旋锁
armasm
// 使用LDXR/STXR实现
spin_lock:
mov w2, #1 // 锁值=1(上锁状态)
1:
ldaxr w1, [x0] // 尝试获取锁
cbnz w1, 1b // 非零表示已锁定,自旋
stlxr w1, w2, [x0] // 尝试获取锁
cbnz w1, 1b // 存储失败则重试
dmb ish // 获取屏障
ret
spin_unlock:
dmb ish // 释放屏障
stlr wzr, [x0] // 原子清零锁
ret
优化策略
- 指数退避:在自旋时增加延迟
- 队列自旋锁:使用CLREX指令优化多核竞争
- WFE指令:在自旋循环中加入低功耗等待
ARMv8/v9同步扩展
armasm
// ARMv8.1新增指令
cas x1, x2, [x0] // 比较并交换(Compare and Swap)
// ARMv8.5的原子操作增强
ldapr x0, [x1] // 单方向Acquire加载
实战练习
- 实现带超时的自旋锁
- 用原子操作构建无锁队列
- 对比LDXR/STXR与CAS指令性能差异
注:所有示例代码需在QEMU或真实ARMv8开发板上验证