与线程相比,是一个轻量级的任务



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

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

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

即使Task在单独的线程上执行,Task和Thread之间通常也不是1:1的关系。这些线程作为池的一部分进行预分配,然后安排任务在可用的线程上运行。创建新任务不需要创建线程的开销,它只需要任务队列中一个查询的开销。

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

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

你是对的——所有的东西都在被子下面运行。

人们说TaskThread更轻量级的原因是,Microsoft花了很多心思让Task s有效地利用Thread s,并且实现的重量可能比一般开发人员使用Thread类自己想到的要轻得多。

编辑

一个更清晰的解释是Task对象比Thread对象更轻,并且当每个Task最终在Thread上运行时,并发创建N个Task对象导致使用的Thread对象少于N个,对于大N

最新更新