第一章:Rust 并发基础
Rust 中的线程
作用域内的线程
共享所有权以及引用计数
静态值(static)
泄漏(Leak)
引用计数
借用和数据竞争
内部可变性
(
Cell
、
RefCell
、
互斥锁以及读写锁
、
Atomic
、
UnsafeCell
)
线程安全:Send 和 Sync
锁:互斥锁和读写锁
Rust 的互斥锁
锁中毒
读写锁
等待:阻塞和条件变量
线程阻塞
条件变量
总结
第二章:Atomic
Atomic 的加载和存储操作
示例:停止标识
示例:进度报道
同步
示例:惰性初始化
获取并修改操作
示例:来自多线程的进度报道
示例:统计数据
示例:ID 分配
比较并交互操作
示例:没有溢出的 ID 分配
示例:惰性一次性初始化
总结
第三章:内存排序
重排和优化
内存模型
Happens-Before 关系
spawn 和 join
Relaxed 排序
Release 和 Acquire 排序
示例:锁定
示例:使用间接的方式惰性初始化
Consume 排序
顺序一致性排序
屏障(Fence)
常见的误解
总结
第四章:构建我们自己的自旋锁
一个最小实现
一个不安全的自旋锁
使用锁守卫的安全接口
总结
第五章:构建我们自己的 Channel
一个简单的以 mutex 为基础的 Channel
一个不安全的一次性 Channel
通过运行时检查来达到安全
通过类型来达到安全
借用以避免内存分配
阻塞
总结
第六章:构建我们自己的“Arc”
基础的引用计数
测试它
可变性
Weak 指针
测试它
优化
总结
第七章:理解处理器
处理器指令
加载和存储操作
读并修改并写操作
x86 lock 前缀
x86 比较并交换指令
ll-和-sc-指令
arm-的-ldxr-和-stxr-指令
arm-的比较并交换操作
缓存
缓存一致性
write-through 协议
MESI 协议
对性能的影响
重排
内存排序
x86-64:强排序
ARM64:弱排序
一个实验
内存屏障
总结
第八章:操作系统原语
使用内核接口
POSIX
在 Rust 中包装类型
Linux
Futex
Futex 操作
优先继承 Futex 操作
macOS
os_unfair_lock
Windows
重量级内核对象
轻量级对象
精简的读写锁(SRW)
基于地址的等待
总结
第九章:构建我们自己的「锁」
Mutex
避免系统调用
进一步优化
基准测试
条件变量
避免系统调用2
避免虚假唤醒
读写锁
避免 writer 忙碌循环
避免 writer 陷入饥饿
总结
第十章:理念和灵感
信号量
RCU
无锁链表
基于队列的锁
基于阻塞的锁
顺序锁
教学材料
索引
注明:本文译自
https://marabos.nl/atomics/
,若其它平台引用此翻译,也请注明出处。
加入我们,编写
索引
或者进行
校对
以帮助更多的人