与Thread相比,Task是轻量级的吗?

时间:2013-06-14 14:35:12

标签: multithreading c#-4.0

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

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

3 个答案:

答案 0 :(得分:7)

您需要区分工作单元(任务)与用于托管/执行它们的基础流程。任务甚至不需要在其他线程上运行。例如,可以在单个线程应用程序中执行任务,该应用程序定期对任务池进行控制。

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

你是对的 - 一切都在一个线索下运行。

人们说TaskThread更轻量级的原因是微软在考虑Task有效利用Thread时付出了很多考虑并且实现的重量可能比普通开发人员使用Thread类自己提出的重量轻得多。

修改

更清楚的解释是,Task对象的重量轻于Thread对象,而每个Task最终都在Thread上运行,因此创建N { {1}}对象同时导致使用少于N个并发Task个对象,对于大N.