序列计数与序列锁Seqcount / seqlock
用写入前后变化的序列值检测读写重叠,读者复制数据并在校验失败时重试。
- 核心约束
- 成功的普通 seqcount 读取需要首尾序列相同且为偶数;写侧必须串行化并满足抢占约束。
- 适用问题
- 短小、多字段、读多写少且允许重试的一致快照,例如系统时间。
- 边界与取舍
- 不能仅靠序列计数保护可被释放的指针;seqcount_t 需外部写锁,seqlock_t 自带写侧锁,latch 变体另有规则。
常见操作#
d 为一次快照复制的数据量,r 为读取重试次数。
| 操作 | 时间成本 | 条件与说明 |
|---|---|---|
| 读取一致快照 | 复制前后检查序列号;r 没有固定上界,写者频繁更新时读者可能长时间重试。 | |
| 写入 | 写侧锁 / 屏障 + 数据修改 | 普通 seqcount 自身不串行化写者;seqlock 增加写锁,且必须满足不可被相应读者抢占的要求。 |
时间与空间#
- 时间成本
- 无冲突读取约 ,冲突增加重试
- 空间成本
- 序列计数 / 写锁 + 读者快照副本
适合可重试的短数据快照。单凭序列号无法保护读者解引用的指针所指对象不被释放。
工程中的应用#
1 个案例 · 附源码Linux 读取系统实时时钟时用序列计数校验多个字段,若期间发生写入就重读,避免把旧的秒值与新的时钟换算状态拼在一起。
附源码片段 · 并发与一致性
基础原理参考资料
Linux 6.12 · Sequence counters and sequential locks重试协议、写者串行化、抢占条件和指针限制。