无畏并发

安全高效地处理并发编程是 Rust 的另一个主要目标。并发编程(程序的不同部分独立执行)和并行编程(程序的不同部分同时执行)正变得越来越重要,因为越来越多的计算机利用了它们的多处理器。从历史上看,在这些上下文中进行编程一直很困难且容易出错:Rust 希望改变这种状况。

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

注意:为了简单起见,我们将许多问题称为并发,而不是更精确地说并发和/或并行。如果本书是关于并发和/或并行的,我们会更具体。对于本章,每当我们使用并发时,请在脑海中替换为并发和/或并行

许多语言对其为处理并发问题提供的解决方案持教条主义态度。例如,Erlang 具有用于消息传递并发的优雅功能,但只有晦涩难懂的方式来共享线程之间的状态。仅支持可能的解决方案的子集对于更高级别的语言来说是合理的策略,因为更高级别的语言承诺通过放弃一些控制权来获得抽象的好处。但是,期望较低级别的语言在任何给定情况下都提供性能最佳的解决方案,并且在硬件上的抽象较少。因此,Rust 提供了多种工具,可以根据您的情况和需求以任何适当的方式对问题进行建模。

以下是本章我们将涵盖的主题

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