第一章: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/,若其它平台引用此翻译,也请注明出处。 加入我们,编写索引或者进行校对以帮助更多的人