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