gpt4 book ai didi

c# - 对于 Task.Factory.StartNew 和 Parallel.Invoke,线程可以在不同的处理器或内核上运行

转载 作者:太空狗 更新时间:2023-10-29 23:36:06 26 4
gpt4 key购买 nike

我希望澄清我对 .NET 多线程的理解,特别是哪些 .NET 方法创建的线程可能会在多处理器/核心系统中的不同处理器或核心上同时执行。

在 .NET TPL 框架中,您可以使用 Parallel.Invoke 或 Task.Factory.StartNew 方法来实现某种并行性。

我的理解是,在这两种情况下,.NET 都会创建新任务(在 Parallel.Invoke 的幕后),然后 .NET 环境将其分配给幕后的托管线程,然后将这些线程分配给 CPU 可能会处理的线程根据工作负载分配给不同的内核或处理器。这两种方法的主要区别在于语义——Parallel.Invoke 执行多个任务并等待它们完成; Task.Factory.StartNew 在后台启动一个新任务。在这两种情况下,实际工作可能在不同的内核或处理器上完成。根据 Task Parallel Library (TPL) .

我有一个同事确信只有 Parallel.Invoke 方法允许线程在不同的核心/处理器上执行,而 Task.Factory.StartNew 启动一个新线程但该线程只会被安排在一个核心上/processor - 所以实际上并没有提供并行性。

我找不到任何文档或文章明确说明是否属于这种情况。我的同事向我推荐了我正在查看的相同文章,例如 Task-based Asynchronous Programming ,我认为这验证了我的理解,但我的同事认为验证了他的理解。

文档有时使用术语“并行处理”来引用 Parallel.Invoke 和“异步任务”来引用“Task.Factory.StartNew”,但据我了解,在后台发生同样的事情分配给多个处理器/内核。

任何人都可以帮助澄清情况,如果可能的话,提供文档/文章的链接。

我知道这听起来像是在寻求与同事争论的解决方案,但我真的想澄清我是否理解正确。

最佳答案

其实很容易回答。

Task.Run()

Queues the specified work to run on the ThreadPool ....

Task Parallel Library

... In addition, the TPL handles the partitioning of the work, the scheduling of threads on the ThreadPool, ....

使用同一个ThreadPool 怎么可能ThreadPool 判断任务类型从而限制CPU?它们要么都在所有处理器上运行,要么都在单个处理器上运行。

额外学分:

这引出了一个问题,ThreadPool 多核感知吗?

答案令人惊讶,它不在乎。 ThreadPool asks the operating system (就像任何对线程使用 new Thread() 的 c# 应用程序一样),它实际上是操作系统的责任。我认为现在已经很清楚了,即使暗示 C# 可以默认限制线程的使用方式也是一个非常荒谬的断言。 (是的,您可以在任何您想要的内核上运行线程等等,但线程池默认并不是这样工作的)。

我强烈推荐阅读 StartNew is Dangerous ... TLDR?使用 Task.Run()

关于c# - 对于 Task.Factory.StartNew 和 Parallel.Invoke,线程可以在不同的处理器或内核上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53180571/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com