我无意中听到一位同事说任务基本上是一个轻量级的线程。来自C ++背景(最轻的处理单元的线程),这对我来说似乎是违反直觉的。
不是任务和线程一样重要吗?
答案 0 :(得分:7)
您需要区分工作单元(任务)与用于托管/执行它们的基础流程。任务甚至不需要在其他线程上运行。例如,可以在单个线程应用程序中执行任务,该应用程序定期对任务池进行控制。
即使在不同的线程上执行任务,任务和线程之间通常也没有1对1的关系。线程被预先分配为池的一部分,然后任务被安排在这些线程上运行。创建新任务不需要创建线程的开销,它只需要任务队列中的enque成本。
这使得任务本身具有更高的可扩展性。在我的应用程序的整个生命周期中,我可以拥有数百万个任务,但实际上只能使用一些恒定数量的线程。
答案 1 :(得分:2)
通常,“线程”意味着强制并发。启动线程需要为其分配堆栈和内部OS数据结构。相反,“任务”通常指的是并发是可选的工作,因此并行框架(如OpenMP,Cilk Plus,TBB,PPL)可以使用相同的线程来执行许多任务,通过序列化任务,并仅在必要时将可选并行性转换为真正的并行性以保持机器忙碌。
答案 2 :(得分:1)
你是对的 - 一切都在一个线索下运行。
人们说Task
比Thread
更轻量级的原因是微软在考虑Task
有效利用Thread
时付出了很多考虑并且实现的重量可能比普通开发人员使用Thread
类自己提出的重量轻得多。
修改强>
更清楚的解释是,Task
对象的重量轻于Thread
对象,而每个Task
最终都在Thread
上运行,因此创建N { {1}}对象同时导致使用少于N个并发Task
个对象,对于大N.