限制ThreadPool中使用的处理器数量

tuj*_*tuj 4 .net c# multithreading threadpool

有没有办法限制ThreadPool对象将使用的处理器数量?根据文档,"您不能将工作线程数或I/O完成线程数设置为小于计算机中处理器数量的数字."

那么如何限制我的程序不使用所有处理器呢?

Tud*_*dor 9

经过一些实验,我认为我有这个东西.我注意到,将ThreadPool系统中的处理器数量视为当前进程可用的处理器数量.这对您有利.

我的CPU中有4个内核.试着打电话SetMaxThreads给2:

ThreadPool.SetMaxThreads(2, 2);
Run Code Online (Sandbox Code Playgroud)

失败,因为我有4个核心,所以数字保持在它们的初始值(我的系统为1023和1000).

但是,就像我最初所说的那样,ThreadPool只考虑了我可以使用的流程可用的处理器数量Process.ProcessorAffinity.这样做:

Process.GetCurrentProcess().ProcessorAffinity = new IntPtr(3);  
Run Code Online (Sandbox Code Playgroud)

将可用处理器限制为前两个核心(因为3 = 11的二进制).SetMaxThreads再次打电话:

ThreadPool.SetMaxThreads(2, 2);
Run Code Online (Sandbox Code Playgroud)

应该像魅力一样工作(至少它对我有用).只需确保在程序启动时使用亲和力设置!

当然,我不会鼓励这种破解,因为无论如何,你的进程在整个执行期间都会遇到有限数量的内核.


ole*_*sii 5

线程池专门用于消除手动管理线程的所有麻烦.OS任务调度程序已经工作了很多年,并且在调度执行任务方面做得非常好.调度程序考虑了多个选项,例如线程优先级,内存位置和与处理器的接近程度等.除非您对这些进程有深入的了解,否则最好不要设置线程关联.

如果我可以引用文档

线程相关性强制线程在特定处理器子集上运行.通常应该避免设置线程关联,因为它可能会干扰调度程序跨处理器有效调度线程的能力.这可以降低并行处理产生的性能增益.适当使用线程关联是测试每个处理器.

可以设置Thread亲和力(相关帖子),您需要为此创建自己的线程对象(而不是线程池中的对象).据我所知,您无法为池中的线程设置线程关联.