Woz*_*oz9 5 c# parallel-processing multithreading task-parallel-library
我希望澄清我对.NET多线程的理解,特别是哪些.NET方法创建的线程可能会在多处理器/核心系统中的不同处理器或内核上同时执行.
在.NET TPL框架中,您可以使用Parallel.Invoke或Task.Factory.StartNew方法来实现某种并行性.
我的理解是,在这两种情况下.NET都会创建新的任务(在Parallel.Invoke的幕后),.NET环境然后在后台分配给托管线程,然后将其分配给线程,CPU可以分配给不同的线程核心或处理器取决于工作负载.这两种方法的主要区别在于语义 - Parallel.Invoke执行多个任务并等待它们完成; Task.Factory.StartNew在后台启动一个新任务.在这两种情况下,实际工作可以在不同的核心或处理器上完成.根据任务并行库(TPL).
我有一位同事确信只有Parallel.Invoke方法允许线程在不同的核心/处理器上执行,而Task.Factory.StartNew启动一个新线程但该线程只能在一个核心/处理器上调度 - 所以实际上并没有给出并行性.
我找不到任何明确说明是否属于这种情况的文件或文章.我的同事向我介绍了我正在查看的相同文章,例如基于任务的异步编程,我认为这可以验证我的理解,但我的同事认为验证了他的.
文档有时使用术语"并行处理"参考Parallel.Invoke和"异步任务"参考"Task.Factory.StartNew",但据我所知,同样的事情发生在背景中关于分配到多处理器/核心.
任何人都可以帮助澄清情况,如果可能的话,链接到文档/文章.
我知道这听起来像是要求与同事一起解决争论,但我真的想澄清我是否正确理解这一点.
其实很容易回答。
将指定的工作排队在线程池上运行...
...此外,TPL 处理工作的分区、ThreadPool 上线程的调度,...
使用相同的ThreadPool,ThreadPool如何确定任务类型以限制CPU?它们要么都在所有处理器上运行,要么都在一个处理器上运行。
额外学分:
这就引出了一个问题:线程池是否支持多核?
答案令人惊讶,它不在乎。ThreadPool向操作系统(就像任何使用new Thread()ThreadPool 的 C# 应用程序一样)请求 Thread,这实际上是操作系统的责任。我认为现在已经很清楚了,即使暗示 C# 可以默认限制线程的使用方式也是一个相当荒谬的断言。(是的,您可以在您想要的任何核心等上运行线程,但这不是线程池默认的工作方式)。
我强烈推荐阅读《StartNew is Dangerous ... TLDR?》使用Task.Run()。