我是线程和并行库的新手。我试图理解MaxDegreeOfParallelism以及它应该设置的值。
做了一些阅读,对我来说可能有点误导。
如果我想在4个线程上运行,我认为我可以做到
var parOptions=new ParallelOptions();
parOptions.MaxDegreeOfParallelism=4;
然而,做一些阅读它看起来像在我的情况下4并不意味着在4个线程上运行,但更多的是与Cores和它使用了多少。
为了简单起见,设置应该运行的线程数的正确方法是什么? 或者也许你可以设置它可以使用的许多线程,但更多的是它使用了多少核心
我计划在config.eg“ThreadCount”中设置一个具有用户可以指定的值的设置。这是一个内部应用程序,其他开发人员将运行以导入内容。
对此有何澄清? 感谢
答案 0 :(得分:5)
您似乎无法理解调度线程的工作原理,您可能希望了解它。简而言之,程序可以创建线程,但它几乎无法控制线程运行的时间和内核,这是操作系统的工作。
因此,当您的程序创建4个线程时,操作系统可能(通常很可能)决定在其4个核心上运行这4个线程。但是如果还有其他进程已经在使用CPU,那么操作系统可能会决定在单个核心上运行这4个线程。
现在,如果将MaxDegreeOfParallelism
设置为4,则意味着使用这些Parallel
的{{1}}循环可能最多使用4个线程来运行循环,但不会更多(尽管允许少用)。如果它决定创建4个线程,那么这些线程将在最多4个核心上运行,这由操作系统决定。
但是当你的代码受CPU约束时(即你没有读取文件或使用网络或类似的东西),那么通常最好不要设置ParallelOptions
,TPL会尝试找到要使用的最佳线程数。
答案 1 :(得分:1)
简短回答 - 从MSDN粘贴 - 通常,您无需修改此设置。
有关详细信息,请查看有关此值的MSDN页面 http://msdn.microsoft.com/en-us/library/system.threading.tasks.paralleloptions.maxdegreeofparallelism(v=vs.110).aspx
这个值应该取决于机器中的核心数量,你正在做的工作类型(cpu密集型与i / o密集型,josbs长度等等)。因此,让并行库来决定运行它的线程数