Rust_Atomics_and_Locks
Rust_Atomics_and_Locks copied to clipboard
Rust Atomics and Locks (中文翻译)
第一章: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/,若其它平台引用此翻译,也请注明出处。