6

我无意中听到一位同事说 Task 基本上是一个轻量级线程。来自 C++ 背景(线程是最轻量的处理单元),这对我来说似乎违反直觉。

任务不是和线程一样重吗?

4

3 回答 3

8

您需要将工作单元(任务)与用于托管/执行它们的底层进程区分开来。任务甚至不需要在其他线程上运行。例如,可以在单线程应用程序中执行任务,该应用程序定期将控制权交给任务池。

即使Task在不同的线程上执行,Task和Thread之间通常也不是一对一的关系。线程作为池的一部分被预先分配,然后任务被安排在可用的这些线程上运行。创建新任务不需要创建线程的开销,它只需要任务队列中的 enque 成本。

这使得任务本质上更具可扩展性。在我的应用程序的整个生命周期中,我可以有数百万个任务,但实际上只能使用一些恒定数量的线程。

于 2013-06-14T14:46:38.193 回答
2

通常,“线程”意味着强制并发。启动线程需要为其分配堆栈和内部 OS 数据结构。相比之下,“任务”通常指的是并发性是可选的工作,因此并行框架(例如 OpenMP、Cilk Plus、TBB、PPL)可以使用同一线程执行许多任务,通过将任务序列化,并且仅在必要时将可选并行性转换为真正的并行性以保持机器繁忙。

于 2013-06-14T14:54:41.593 回答
1

你是对的 - 一切都在幕后的线程上运行。

人们说 aTask比 a 更轻量级的原因Thread是微软在让Tasks 有效利用Threads 方面花了很多心思,而且实现可能比普通开发人员自己使用Thread班级。

编辑

一个更明确的解释是,一个Task对象比一个对象更轻Thread,虽然每个对象Task最终都在 a 上运行,但同时Thread创建 N个Task对象会导致使用的并发对象少于 N个Thread,因为 N 很大。

于 2013-06-14T14:43:12.227 回答