C# 如何使用专用内核来旋转等待线程?

C# 如何使用专用内核来旋转等待线程?,c#,multithreading,C#,Multithreading,我有延迟关键的代码,我在那里旋转等待。我想在专用的内核上运行它(我总共有12个内核,所以只为那个任务使用一个内核是可以的)。 我试着用这种方式来完成它: new Thread(Work).Start(); private void Work() { Process Proc = Process.GetCurrentProcess(); ProcessThread Thread = Proc.Threads[0]; var

我有延迟关键的代码,我在那里旋转等待。我想在专用的内核上运行它(我总共有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%的线程。 但是在TaskManager中,我没有看到任何“100”个被占用的内核。为什么?如何在专用内核上启动自旋等待线程


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

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

如果您还设置Process.BasePriority=RealTime和Thread.Priority=Highest,那么您可能会在该核心上看到接近100%的内容。(我不建议在生产代码中使用此选项)


不过,根据您的操作对时间的要求,使用.Net平台可能不够

您试图做的事情与多线程编程的理念背道而驰。如果您有足够的处理能力,就没有必要了。如果您的资源太少,那么优先级队列就是您的解决方案。您是否尝试过为线程设置IdealProcessor@DariuszWawer我确实有足够的能力,但是由于某种原因,.NET不明白我的线程是spin wait,最好在专用内核上运行。@Richard不,谢谢,我会试试。@javapowered,所以你实际上是在试图强制执行忙等待反模式,你失败了,您想使用技巧让编译器/系统来完成它。。。是的。那么在.NET中没有办法使用“进程或线程专用核心”吗?如果这只是.NET限制(在其他语言如c++中可能)或操作系统限制(在Linux中可能),或者在任何语言和任何操作系统中都不可能实现?不,您不能只使用一个内核来运行线程。操作系统可能仍然会安排其他线程在该内核上运行。这不是一个.Net限制,它是一个Windows的东西。当然,Windows有嵌入式变体,但我在这方面没有太多经验。我至少可以告诉.NET将某些线程“保留”在同一个核心上吗?告诉它不要试图把它移到另一个核心,你可以做到。设置进程关联与设置
process.ProcessorAffinity
属性一样简单,但在设置托管线程关联时,需要使用
thread.BeginThreadAffinity()
。请参阅。感谢您链接中的代码!现在我看到一个核心100%的CPU负载。然而,我不知道我会赢得多少延迟,我只是希望“避免移动到另一个核心”是更好和更快的定义。。。(在延迟方面)