Rust 原子同步原语与互斥锁实现
1. 单线程与多线程程序顺序
Rust 不保证多线程程序的执行顺序,但确保单线程代码按文本顺序执行,即便优化后的 Rust 代码和底层硬件可能会对指令进行重排。当满足以下条件时,可认为操作 A 与操作 B 同步:
- 操作 B 是以 Acquire 或 SeqCst 顺序从某个原子变量 WBS 进行加载。
- 操作 A 是以 Release 或 SeqCst 顺序向同一原子变量 WBS 进行存储。
- 操作 B 读取到了操作 A 存储的值。
最后一点是为了防止编译器或硬件对操作 B 的加载进行优化。
2. 线性一致性与因果顺序
一个 Rust 结构可能遵循因果顺序,但在检查时不一定具有线性一致性。例如之前章节讨论的 Ring ,尽管因果顺序由互斥锁保护,但由于偏移量错误,写入操作可能会被覆盖。因此,确保程序的因果关系是编写适用的并发数据结构的必要但不充分条件。线性一致性是对数据结构操作的分析,而 happens-before / synchronizes-with 是操作内部和操作之间的顺序。
超级会员免费看
订阅专栏 解锁全文

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



