Col*_*ett 8 c# multithreading .net-3.5
我在.NET 3.5控制台应用程序中有一些令人尴尬的可并行化工作,我想利用超线程和多核处理器. 如何在任意系统上选择最佳数量的工作线程来充分利用其中任何一种? 例如,如果它是双核,我将需要2个线程; 四核我想要4个线程.我最终得到的是确定处理器特性,以便我知道要创建多少线程.
我不是问如何拆分工作也不是如何进行线程,我问我如何确定这个控制台应用程序运行的任意机器上的"最佳"线程数.
Joe*_*oey 10
你可以使用Environment.ProcessorCount,如果这是你唯一的事情.但通常使用ThreadPool确实是更好的选择.
.NET线程池还有一些条件,有时会分配比核心更多的线程,以便在许多线程等待I/O完成的某些情况下最大化吞吐量.
正确的数字显然是42。
现在请注意。总是使用线程池。
1)如果您有一个冗长的处理任务(即CPU密集型)可以划分为多个工作餐,则应该对任务进行划分,然后将所有单个工作项提交给ThreadPool。线程池将具有动态监视功能,因为它具有自我监视功能,其中包括根据需要启动新线程,并且可以在部署时由管理员根据部署站点的要求进行配置,从而可以动态方式开始处理它们。,而不是在开发时预先计算数字。虽然处理任务的适当分区大小可以考虑可用的CPU数量是正确的,但正确的答案很大程度上取决于任务的性质以及在此阶段甚至不值得讨论的数据(以及首先要考虑的是您的NUMA节点,内存位置和互锁的缓存争用,并且仅在此之后才是核心数)。
2)如果您正在执行I / O(包括DB调用),则应使用异步I / O,并在ThreadPool中完成称为完成例程的调用。
这两个是您应该具有多个线程的唯一有效原因,并且都可以通过使用ThreadPool来最好地处理它们。实际上,包括在“请求”或“连接”中启动线程在内的所有其他事情实际上都是Win32 API世界中的反模式(叉是* nix中的有效模式,但在Windows上绝对不是)。
为了更专业,更详细地讨论该主题,我只能推荐有关该主题的Rick Vicik论文: