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