无畏并发
安全高效地处理并发编程是 Rust 的另一个主要目标。并发编程,即程序的不同部分独立执行,以及并行编程,即程序的不同部分同时执行,随着越来越多的计算机利用其多处理器的优势,变得越来越重要。历史上,在这些上下文中的编程一直很困难且容易出错。Rust 希望改变这一点。
最初,Rust 团队认为确保内存安全和防止并发问题是两个需要不同方法解决的独立挑战。随着时间的推移,团队发现所有权和类型系统是帮助管理内存安全和并发问题的一套强大工具!通过利用所有权和类型检查,许多并发错误在 Rust 中是编译时错误,而不是运行时错误。因此,与其让你花费大量时间尝试重现运行时并发错误发生的确切情况,错误的代码将拒绝编译并显示解释问题的错误。因此,你可以在编写代码时修复它,而不是在代码已经发布到生产环境后才可能修复。我们将 Rust 的这一方面称为无畏并发。无畏并发允许你编写没有细微错误的代码,并且易于重构而不会引入新的错误。
注意:为了简单起见,我们将许多问题称为并发,而不是更精确地说并发和/或并行。在本章中,请在我们使用并发时,心理上替换为并发和/或并行。在下一章中,当区别更为重要时,我们会更加具体。
许多语言对它们提供的处理并发问题的解决方案持教条态度。例如,Erlang 在消息传递并发方面具有优雅的功能,但在线程之间共享状态的方式却晦涩难懂。对于高级语言来说,仅支持可能的解决方案的一个子集是合理的策略,因为高级语言承诺通过放弃一些控制来获得抽象的好处。然而,低级语言期望在任何给定情况下提供最佳性能的解决方案,并且对硬件的抽象较少。因此,Rust 提供了多种工具,以适合你情况和需求的方式对问题进行建模。
以下是本章将涵盖的主题:
- 如何创建线程以同时运行多个代码片段
- 消息传递并发,其中通道在线程之间发送消息
- 共享状态并发,其中多个线程可以访问某些数据
Sync
和Send
trait,它们将 Rust 的并发保证扩展到用户定义的类型以及标准库提供的类型