第16章 无畏并发

Rust 如何用所有权与类型系统安全、高效地处理并发

译文 · 基于 The Rust Programming Language(rustc 1.97.1)

无畏并发

原文链接: https://doc.rust-lang.org/stable/book/ch16-00-concurrency.html

  安全而高效地处理并发编程,是 Rust 的另一大目标。并发编程(concurrent programming)指程序的不同部分彼此独立地执行;并行编程(parallel programming)指程序的不同部分同时执行。随着越来越多的计算机利用多处理器,这两者都愈发重要。历史上,在这类场景下编程既困难又容易出错。Rust 希望改变这一点。

  起初,Rust 团队认为保证内存安全与防止并发问题是两项独立挑战,需要用不同方法解决。随着时间推移,团队发现所有权与类型系统是一套强大的工具,既能帮助管理内存安全,也能帮助应对并发问题!借助所有权与类型检查,许多并发错误在 Rust 中会变成编译期错误,而不是运行时错误。因此,你不必花大量时间去复现某个运行时并发 bug 的确切条件——不正确的代码会拒绝编译,并给出解释问题的错误信息。这样一来,你可以在编写过程中就修好代码,而不是可能在上线生产之后才发现问题。我们把 Rust 的这一面向戏称为无畏并发(fearless concurrency)。无畏并发让你写出不易出现隐蔽 bug、又易于重构且不易引入新 bug 的代码。

说明:为简洁起见,我们会把许多问题统称为“并发”,而不总是精确地说“并发和/或并行”。在本章中,请把我们所说的“并发”在脑中替换为“并发和/或并行”。下一章在区分更重要时,我们会说得更具体。

  许多语言在处理并发问题上立场鲜明。例如,Erlang 在基于消息传递的并发上设计优雅,但对线程间共享状态的支持相对有限。只支持一部分解决方案,对高级语言来说是合理策略,因为高级语言承诺:放弃部分控制以换取抽象带来的好处。然而,人们期望低级语言在任何给定情形下都能提供性能最佳的方案,并且对硬件的抽象更少。因此,Rust 提供了多种工具,让你能按实际情形与需求来建模问题。

  本章将涵盖这些主题:

  • 如何创建线程,以便同时运行多段代码
  • 消息传递(message-passing)并发:通过通道在线程间发送消息
  • 共享状态(shared-state)并发:多个线程可以访问同一块数据
  • Sync 与 Send 特征,把 Rust 的并发保证扩展到用户自定义类型,以及标准库提供的类型

16.1 用线程同时运行代码

用 thread::spawn 创建线程,并用 join 与 move 闭包管理它们

16.2 用消息传递在线程间传送数据

用通道在线程间安全地传递消息与所有权

16.3 共享状态并发

用 Mutex 与 Arc 在多线程间安全共享可变状态

16.4 用 Send 与 Sync 实现可扩展并发

用 Send 与 Sync 标记特征扩展 Rust 的并发保证

最后修改 August 11, 2026: 更新 (70a5af133)