Rust从入门到实战系列一百八十五:无畏并发

ch16-00-concurrency.md commit 1fedfc4b96c2017f64ecfcf41a0a07e2e815f24f
安全且高效的处理并发编程是 Rust 的另一个主要目标。并发编程(Concurrent programming),代表
程序的不同部分相互独立的执行,而 并行编程(parallel programming)代表程序不同部分于同时执行,
这两个概念随着计算机越来越多的利用多处理器的优势时显得愈发重要。由于历史原因,在此类上下文
中编程一直是困难且容易出错的:Rust 希望能改变这一点。
起初,Rust 团队认为确保内存安全和防止并发问题是两个分别需要不同方法应对的挑战。随着时间的推
移,团队发现所有权和类型系统是一系列解决内存安全 和并发问题的强有力的工具!通过利用所有权和
类型检查,在 Rust 中很多并发错误都是 编译时错误,而非运行时错误。因此,相比花费大量时间尝试
重现运行时并发 bug 出现的特定情况,Rust 会拒绝编译不正确的代码并提供解释问题的错误信息。因
此,你可以在开发时修复代码,而不是在部署到生产环境后修复代码。我们给 Rust 的这一部分起了一个
绰号 无畏并发(fearless concurrency)。无畏并发令你的代码免于出现诡异的 bug 并可以轻松重构且无
需担心会引入新的 bug。
注意:出于简洁的考虑,我们将很多问题归类为 并发,而不是更准确的区分 并发和(或)并行。如
果这是一本专注于并发和∕或并行的书,我们肯定会更加精确的。对于本章,当我们谈到 并发时,请
自行脑内替换为 并发和(或)并行。
很多语言所提供的处理并发问题的解决方法都非常有特色。例如,Erlang 有着优雅的消息传递并发功能,
但只有模糊不清的在线程间共享状态的方法。对于高级语言来说,只实现可能解决方案的子集是一个合
理的策略,因为高级语言所许诺的价值来源于牺牲一些控制来换取抽象。然而对于底层语言则期望提供
在任何给定的情况下有着最高的性能且对硬件有更少的抽象。因此,Rust 提供了多种工具,以符合实际
情况和需求的方式来为问题建模。
如下是本章将要涉及到的内容:
• 如何创建线程来同时运行多段代码。
• 消息传递(Message passing)并发,其中通道(channel)被用来在线程间传递消息。
• 共享状态(Shared state)并发,其中多个线程可以访问同一片数据。
• Sync 和 Send trait,将 Rust 的并发保证扩展到用户定义的以及标准库提供的类型中。
使用线程同时运行代码
ch16-01-threads.md commit 6b9eae8ce91dd0d94982795762d22077d372e90c
在大部分现代操作系统中,已执行程序的代码在一个 进程(process)中运行,操作系统则负责管理多个进
程。在程序内部,也可以拥有多个同时运行的独立部分。运行这些独立部分的功能被称为 线程(threads)。
将程序中的计算拆分进多个线程可以改善性能,因为程序可以同时进行多个任务,不过这也会增加复杂
性。因为线程是同时运行的,所以无法预先保证不同线程中的代码的执行顺序。这会导致诸如此类的问题:
• 竞争状态(Race conditions),多个线程以不一致的顺序访问数据或资源
• 死锁(Deadlocks),两个线程相互等待对方停止使用其所拥有的资源,这会阻止它们继续运行
• 只会发生在特定情况且难以稳定重现和修复的 bug
Rust 尝试减轻使用线程的负面影响。不过在多线程上下文中编程仍需格外小心,同时其所要求的代码结
构也不同于运行于单线程的程序。
编程语言有一些不同的方法来实现线程。很多操作系统提供了创建新线程的 API。这种由编程语言调用
操作系统 API 创建线程的模型有时被称为 1:1,一个 OS 线程对应一个语言线程。Rust 标准库只提供了
1:1 线程实现;有一些 crate 实现了其他有着不同取舍的线程模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值