无畏并发

安全高效地处理并发编程是 Rust 的另一个主要目标。并发编程是指程序的不同部分独立执行,而并行编程是指程序的不同部分同时执行,随着越来越多的计算机利用其多处理器,这变得越来越重要。从历史上看,在这种环境下进行编程一直很困难且容易出错。Rust 希望改变这一点。

最初,Rust 团队认为确保内存安全和防止并发问题是两个独立的挑战,需要用不同的方法来解决。随着时间的推移,团队发现所有权和类型系统是一组强大的工具,有助于管理内存安全并发问题!通过利用所有权和类型检查,许多并发错误在 Rust 中是编译时错误,而不是运行时错误。因此,不正确的代码将拒绝编译并显示解释问题的错误,而不是让你花费大量时间尝试重现运行时并发错误发生的具体情况。结果,你可以在编写代码时修复它,而不是在它可能已发布到生产环境之后。我们将 Rust 的这个方面昵称为无畏 并发。无畏并发允许你编写没有细微错误的、易于重构且不会引入新错误的代码。

注意:为了简洁起见,我们将许多问题称为并发问题,而不是更精确地说并发和/或并行。在本章中,无论何时我们使用并发,请在脑海中将其替换为并发和/或并行。在下一章中,区别更重要时,我们将更具体。

许多语言对于它们提供的处理并发问题的解决方案是教条式的。例如,Erlang 在消息传递并发方面提供了优雅的功能,但在线程间共享状态方面只有模糊的方式。对于高级语言来说,仅支持部分可能的解决方案是一种合理的策略,因为高级语言承诺通过放弃部分控制来获得抽象的好处。然而,低级语言应该在任何给定情况下提供性能最佳的解决方案,并且对硬件的抽象更少。因此,Rust 提供了各种工具,可以根据你的情况和需求以任何适当的方式来建模问题。

本章将涵盖以下主题:

  • 如何创建线程以同时运行多段代码
  • 消息传递并发,其中通道在线程之间发送消息
  • 共享状态并发,其中多个线程可以访问某些数据
  • SyncSend trait,它们将 Rust 的并发保证扩展到用户定义类型以及标准库提供的类型