.Net Parallels,Task API 与常规线程

本文关键字:常规 线程 API Task Parallels Net | 更新日期: 2023-09-27 18:31:37

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

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

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

.Net Parallels,Task API 与常规线程

默认情况下,.NET 线程池初始化与计算机上的逻辑内核数相对应的工作线程数。随后,它采用爬山启发式方法,根据当前任务工作负载调整此数字,在任务完成时间过长时启动新的工作线程。

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

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