C# 多线程应用程序是否绑定到单个核心?
我正在运行一个使用.NET2.0构建的.NETRemoting应用程序。这是一个控制台应用程序,尽管我删除了Main上的[StatThread] 我使用的TCP通道在后台使用线程池 据报道,在双核机箱上运行时,在高负载下,应用程序的CPU使用率从未超过50%(尽管我见过四核的CPU使用率为70%或更多) 对于远程处理应用程序或线程池,在多核方面是否有任何限制 为了使多线程应用程序在多个内核上运行,是否需要更改某些内容C# 多线程应用程序是否绑定到单个核心?,c#,performance,multithreading,C#,Performance,Multithreading,我正在运行一个使用.NET2.0构建的.NETRemoting应用程序。这是一个控制台应用程序,尽管我删除了Main上的[StatThread] 我使用的TCP通道在后台使用线程池 据报道,在双核机箱上运行时,在高负载下,应用程序的CPU使用率从未超过50%(尽管我见过四核的CPU使用率为70%或更多) 对于远程处理应用程序或线程池,在多核方面是否有任何限制 为了使多线程应用程序在多个内核上运行,是否需要更改某些内容 谢谢多线程应用不需要绑定到单个核心。您可以使用检查线程的关联性(它操作的内核数
谢谢多线程应用不需要绑定到单个核心。您可以使用检查线程的关联性(它操作的内核数)。我不确定默认行为是什么,但如果需要,可以通过编程方式进行更改 下面是一个如何执行此操作的示例() 以及输出:
当前处理器关联性:3
当前处理器关联性:2
上面的代码首先显示进程在两个内核上运行。然后它变为只使用第二个内核,并显示它现在只使用第二个内核。您可以阅读上的.NET文档,了解各种数字对关联性的含义。不应该有
您可能会看到这种行为的原因有几个:
我会尝试调查每一个,看看原因是什么。多线程应用程序将使用您的所有内核 我怀疑你的行为是由于以下陈述: 我使用的TCP通道在后台使用线程池 TCP,以及大多数套接字/文件/etc代码,倾向于使用很少的CPU。它大部分时间都在等待,因此程序的CPU使用率可能永远不会飙升。尝试在大量计算的情况下使用线程池,您将看到处理器的CPU使用率接近100%
Console.WriteLine("Current ProcessorAffinity: {0}",
Process.GetCurrentProcess().ProcessorAffinity);
Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;
Console.WriteLine("Current ProcessorAffinity: {0}",
Process.GetCurrentProcess().ProcessorAffinity);