我无意中听到一位同事说 Task 基本上是一个轻量级线程。来自 C++ 背景(线程是最轻量的处理单元),这对我来说似乎违反直觉。
任务不是和线程一样重吗?
我无意中听到一位同事说 Task 基本上是一个轻量级线程。来自 C++ 背景(线程是最轻量的处理单元),这对我来说似乎违反直觉。
任务不是和线程一样重吗?
您需要将工作单元(任务)与用于托管/执行它们的底层进程区分开来。任务甚至不需要在其他线程上运行。例如,可以在单线程应用程序中执行任务,该应用程序定期将控制权交给任务池。
即使Task在不同的线程上执行,Task和Thread之间通常也不是一对一的关系。线程作为池的一部分被预先分配,然后任务被安排在可用的这些线程上运行。创建新任务不需要创建线程的开销,它只需要任务队列中的 enque 成本。
这使得任务本质上更具可扩展性。在我的应用程序的整个生命周期中,我可以有数百万个任务,但实际上只能使用一些恒定数量的线程。
通常,“线程”意味着强制并发。启动线程需要为其分配堆栈和内部 OS 数据结构。相比之下,“任务”通常指的是并发性是可选的工作,因此并行框架(例如 OpenMP、Cilk Plus、TBB、PPL)可以使用同一线程执行许多任务,通过将任务序列化,并且仅在必要时将可选并行性转换为真正的并行性以保持机器繁忙。
你是对的 - 一切都在幕后的线程上运行。
人们说 aTask
比 a 更轻量级的原因Thread
是微软在让Task
s 有效利用Thread
s 方面花了很多心思,而且实现可能比普通开发人员自己使用Thread
班级。
编辑
一个更明确的解释是,一个Task
对象比一个对象更轻Thread
,虽然每个对象Task
最终都在 a 上运行,但同时Thread
创建 N个Task
对象会导致使用的并发对象少于 N个Thread
,因为 N 很大。