并行库的MaxDegreeOfParallelism值?

use*_*969 0 c# task-parallel-library

我是线程和并行库的新手。我试图了解MaxDegreeOfParallelism以及应将其设置为什么值。

做一些阅读,对我来说可能有点误导。

如果我想在4个线程上运行,我想我可以做

var parOptions=new ParallelOptions();
parOptions.MaxDegreeOfParallelism=4;
Run Code Online (Sandbox Code Playgroud)

但是,在我的情况下,多读一些内容似乎并不意味着可以在4个线程上运行,而是更多地涉及Cores及其使用量。

为简单起见,设置应运行的线程数的正确方法是什么?或者,也许您可​​以在它可以使用的多个线程上进行设置,但是可以在其使用的核心数量上进行更多设置

我打算在config.eg“ ThreadCount”中设置一个用户可以指定的值。这是其他开发人员将运行的内部应用程序,用于导入内容。

任何澄清吗?谢谢

svi*_*ick 5

似乎您不了解调度线程的工作原理,您可能需要阅读一下。简而言之,程序可以创建线程,但是它几乎不能控制线程何时以及在哪个内核上运行,这是操作系统的工作。

因此,当您的程序创建4个线程时,操作系统很有可能(通常很可能)决定在其4个内核上运行这4个线程。但是,如果已经有其他进程在使用CPU,则OS可能会决定例如在单个内核上运行这4个线程。

现在,如果将其设置MaxDegreeOfParallelism为4,则意味着Parallel使用它们的循环ParallelOptions最多可以使用4个线程来运行该循环,但不会更多(尽管允许使用更少的线程)。如果它决定创建4个线程,则这些线程将在最多4个内核上运行,这由操作系统决定。

但是,当您的代码受CPU约束时(即,您不读取文件或使用网络或类似方法),通常最好是不进行设置MaxDegreeOfParallelism,TPL会尝试找到要使用的最佳线程数量。