【问题标题】:How to use dedicated core for spin-waiting Thread?如何使用专用内核进行自旋等待线程?
【发布时间】:2013-02-18 10:38:16
【问题描述】:

我在旋转等待的地方有延迟关键代码。我想在专用核心上运行它(我总共有 12 个核心,所以可以只为该任务花费一个核心)。 我试过用这种方式完成它:

    new Thread(Work).Start();

    private void Work()
    {
        Process Proc = Process.GetCurrentProcess();
        ProcessThread Thread = Proc.Threads[0];
        var AffinityMask = 0x0002; // use only the second processor, despite availability
        Thread.ProcessorAffinity = (IntPtr)AffinityMask;
        while (true)
        {
            Iterate();
        }
    }

我期待在设置 ProcessorAffinity 后,我的线程将始终在第二个核心上工作,因此我也将 100% 在第二个核心上工作。 但是在任务管理器中,我看不到任何“100”个占用的核心。为什么?如何在专用核心上启动自旋等待线程?

upd 现在我认为这可能是错误的Proc.Threads[0]?我需要current 线程而不是0 线程?

【问题讨论】:

  • 您正在尝试做的是违背多线程编程的想法。如果您有足够的处理能力,则没有必要。如果您的资源太少,优先队列就是您的解决方案。
  • 你试过为线程设置 IdealProcessor 吗? msdn.microsoft.com/en-us/library/…
  • @DariuszWawer 我确实有足够的能力,但是 .NET 由于某种原因不明白我的线程是自旋等待的,最好在专用核心上运行。
  • @Richard 不,谢谢,我会试试的。
  • @javapowered 所以你实际上是在试图强制一个忙等待的反模式,你失败了,你想使用技巧让编译器/系统做到这一点......对。

标签: c# multithreading


【解决方案1】:

您不会看到 100% 仅仅因为您已在该线程上设置了线程关联性,因为操作系统仍会在该内核上调度其他线程,而您的线程只会获得一部分周期。

如果您还设置了 Process.BasePriority = RealTime 和 Thread.Priority = Highest,那么您可能会在该核心上看到 接近 100% 的东西。 (我不会在生产代码中推荐这个)。

根据您的操作对时间的要求如何,.Net 平台可能还不够。

【讨论】:

  • 所以没有办法在.NET中使用“进程或线程的专用核心”?如果这只是 .NET 限制(并且可能在其他语言中,例如 c++)或操作系统限制(并且可能在 Linux 中),或者它在任何语言和任何操作系统中都不可能?
  • 不,您不能将一个核心专用于仅运行 your 线程。操作系统可能仍会安排其他线程在该内核上运行。这不是 .Net 限制,而是 Windows 的东西。当然,Windows 有嵌入式变体,但我在这些方面没有太多经验。
  • 我至少可以告诉 .NET 将某些线程“保留”在同一个核心上吗?告诉它不要尝试将其移动到另一个核心。
  • 那个,你可以的。设置进程亲和性就像设置Process.ProcessorAffinity 属性一样简单,但是在设置托管线程亲和性时,您需要使用Thread.BeginThreadAffinity()。见here
  • 感谢您链接中的代码有效!现在我确实看到一个核心 100% CPU 负载。但是我不知道我会赢得多少延迟,我只是希望“避免移动到另一个核心”在定义上会更好更快......(就延迟而言)
猜你喜欢
  • 2013-12-28
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2013-03-02
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多