.Net Parallel,Task API和常规线程

时间:2013-09-17 07:58:11

标签: c# .net multithreading parallel-processing

据我所知,Parallel API在内部使用线程池并将它们排队以进行并行处理,但是,当我使用SOS调试器检查一个这样的并行循环的执行时,我的理解是,如果我有10个任务排队然后所有这些可能不并行,CLR将决定为要执行的给定任务分派多少线程,因此它可能是4或5或6(每次执行中的数字不同)

但是,如果我的总任务数如果不是很高,如10并且我希望所有这些都并行,因为所有这些都是长时间运行的,那么最好将它们放在传统线程上,这将确保1每个任务的线程,它们都是并行的 如果任务数量很好,如100,那么使用Parallel或Threadpool是一个实用的解决方案,因为我们不希望每个进程调用100个单独的线程

请分享您的观点,我理解并行API的好处使完整的并行编程非常容易实现,但在这里我的目标是不同的

1 个答案:

答案 0 :(得分:6)

默认情况下,.NET线程池初始化许多工作线程,这些线程对应于计算机上的逻辑核心数。它随后采用爬山式启发式算法,根据当前任务工作负载调整此数量,当任务需要很长时间才能完成时启动新的工作线程。

您希望通过线程超额预订(即每个逻辑核心运行多个线程)同时执行长时间运行的任务,这是正确的。实际上,任务并行库基础结构(TPL)通过LongRunning选项专门为此场景提供,该选项(在当前实现下)为每个标记的任务生成一个新的专用线程。

Task.Factory.StartNew(myLongRunningAction, TaskCreationOptions.LongRunning);