代码之家  ›  专栏  ›  技术社区  ›  pablo

多线程应用程序是否绑定到单个核心?

  •  5
  • pablo  · 技术社区  · 15 年前

    我正在运行一个使用.NET2.0构建的.NETRemoting应用程序。这是一个控制台应用程序,尽管我删除了Main上的[StatThread]。

    我使用的TCP通道在后台使用线程池。

    对于远程处理应用程序或线程池,在多核方面是否有任何限制?

    为了使多线程应用程序在多个内核上运行,是否需要更改某些内容?

    3 回复  |  直到 15 年前
        1
  •  10
  •   Scott Wisniewski    15 年前

    不应该有。

    您可能会看到这种行为的原因有几个:

    1. 你的线程是IO绑定的。

      在这种情况下,您将不会看到很多并行性,因为所有内容都将在磁盘上等待。单个磁盘本身就是连续的。

    2. 您的锁粒度太小

      您的应用程序可能会花费大部分时间获取锁,而不是执行应用程序逻辑。这会大大减慢速度。

    3. 如果锁定不够精细,那么其他线程可能会花费大量时间等待。

    4. 您有很多锁争用

      您的线程可能都试图在同一时间锁定相同的资源,使它们具有内在的顺序性。

    5. 您可能没有正确划分线程。

    6. 您的流程可能没有很多可用的并行性

      你可能只是在做一些不能同时完成的事情。

    我会尝试调查每一个,看看原因是什么。

        2
  •  6
  •   Reed Copsey    15 年前

    多线程应用程序将使用所有内核。

    我怀疑你的行为是由于以下陈述:

    我使用的TCP通道在后台使用线程池。

    TCP,以及大多数套接字/文件/etc代码,倾向于使用很少的CPU。它大部分时间都在等待,因此程序的CPU使用率可能永远不会飙升。尝试在大量计算的情况下使用线程池,您将看到处理器的CPU使用率接近100%。

        3
  •  4
  •   Community CDub    9 年前

    ProcessThread.ProcessorAffinity . 我不确定默认行为是什么,但如果需要,可以通过编程方式进行更改。

    下面是一个如何做到这一点的示例( taken directly from TechRepublic )

    Console.WriteLine("Current ProcessorAffinity: {0}", 
                      Process.GetCurrentProcess().ProcessorAffinity);
    
    Process.GetCurrentProcess().ProcessorAffinity = (System.IntPtr)2;
    
    Console.WriteLine("Current ProcessorAffinity: {0}", 
                      Process.GetCurrentProcess().ProcessorAffinity);
    

    以及输出:

    Current ProcessorAffinity: 3
    Current ProcessorAffinity: 2

    上面的代码首先显示进程在两个内核上运行。然后它变为只使用第二个内核,并显示它现在只使用第二个内核。您可以在上阅读.NET文档 ProcessorAffinity