From d18ae377e58da23ef7c39ecf4649d878062c8a0f Mon Sep 17 00:00:00 2001 From: scitarust <94152172+scitarust@users.noreply.github.com> Date: Tue, 17 Jun 2025 16:45:14 +0800 Subject: [PATCH] Update ch17-06-futures-tasks-threads.md --- src/ch17-06-futures-tasks-threads.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ch17-06-futures-tasks-threads.md b/src/ch17-06-futures-tasks-threads.md index c625d76..f821648 100644 --- a/src/ch17-06-futures-tasks-threads.md +++ b/src/ch17-06-futures-tasks-threads.md @@ -27,7 +27,7 @@ 尽管它们是相似的,这两种方式的行为非常不同,尽管在这个非常简单的例子中我们可能很难进行测量。我们可以在任何现代计算机中产生数以百万计的异步任务。如果尝试用线程来这样做,我们实际上会耗尽内存! -然而,这些 API 如此相似是有理由的。线程作为同步操作集的边界;线程**之间**的并发是可能的。任务作为**异步**操作集的边界,任务**之间**和**之内**的并发是可能的,因为任务可以在其内部切换 future。最后,future 是 Rust 中最细粒度的并发单位,同时每一个 future 可能代表一个其它 future 的数。其运行时 -- 更具体地说,其执行器(executor)-- 管理任务,任务则管理 future。在这一点上,任务类似于轻量的、运行时管理的线程,并具有由运行时而非操作系统管理所赋予的额外能力。 +然而,这些 API 如此相似是有理由的。线程作为同步操作集的边界;线程**之间**的并发是可能的。任务作为**异步**操作集的边界,任务**之间**和**之内**的并发是可能的,因为任务可以在其内部切换 future。最后,future 是 Rust 中最细粒度的并发单位,同时每一个 future 可能代表一棵由其它 future 组成的树。其运行时 -- 更具体地说,其执行器(executor)-- 管理任务,任务则管理 future。在这一点上,任务类似于轻量的、运行时管理的线程,并具有由运行时而非操作系统管理所赋予的额外能力。 这并不意味着异步任务总是优于线程(反之亦然)。基于线程的并发在某种程度上来说是一个比基于 `async` 的并发更简单的编程模型。这既可以是优点,也可以是缺点。线程有点像 “射后不理”(“fire and forget”);它们没有原生等同于 future 的机制,所以它们简单地运行到结束而不会被中断,除非操作系统本身介入。也就是说,它们没有像 future 那样内建**任务内并发**(**intratask concurrency**)支持。Rust 中的线程也没有提供取消机制 -- 本章虽未明确讨论此主题,但当我们结束一个 future 时,其状态能够被正确清理就隐含了这一事实。