如何确定线程运行的CPU?

有没有办法确定给定线程在哪个CPU上运行? 最好是在C#中,但C ++会这样做。

.NET Process和ProcessThread类似乎不提供此信息。

ETA澄清:

我们正在开发一个服务器应用程序,用于处理http多播流并生成多个video编码器。 它在具有12个物理内核的系统上运行,从而产生24个逻辑CPU(超线程)。 通过TaskManager和ProcessExplorer,我们validation了我们生成的进程在逻辑CPU上均匀分布。 但是,我们在一个CPU上看到很多(内核?)活动,这些活动因占用不寻常的CPU时间而产生干扰。 我们正在尝试确定在此特定CPU上运行的进程/线程。 TaskManager和ProcessExplorer似乎都没有提供这些信息。 如果他们这样做,请说明如何获得这些信息。

否则,我们正在考虑编写自己的工具来获取此信息。 这就是我们需要帮助的地方。

我们知道如何更改线程亲缘关系(我们知道无法保证线程将保持与任何CPU关联,尽管在这种特殊情况下,占用CPU的线程仍然只与一个CPU相关联),但是为了做到这一点,我们需要首先确定需要重新定位WHICH进程/线程。 这是这个问题的唯一目标。

我希望这有助于澄清问题。

在MSDN中 ,使用ProcessThread.ProcessorAffinity属性可以设置线程关联,但是无法获取它。 默认情况下,线程没有亲和力(可以在任何处理器上运行)。

using System; using System.Diagnostics; namespace ProcessThreadIdealProcessor { class Program { static void Main(string[] args) { // Make sure there is an instance of notepad running. Process[] notepads = Process.GetProcessesByName("notepad"); if (notepads.Length == 0) Process.Start("notepad"); ProcessThreadCollection threads; //Process[] notepads; // Retrieve the Notepad processes. notepads = Process.GetProcessesByName("Notepad"); // Get the ProcessThread collection for the first instance threads = notepads[0].Threads; // Set the properties on the first ProcessThread in the collection threads[0].IdealProcessor = 0; threads[0].ProcessorAffinity = (IntPtr)1; } } } 

类似地, Thread.SetProcessorAffinity做同样的事情。

这是不可能以连续可靠的方式进行的。 OS任务调度程序优化线程并在可用CPU核心之间拆分负载。 通常情况下,线程可以在任何CPU上执行。 此外,通过上下文切换,它还可以改变它的CPU。

如果您需要精确定位一个线程或一个进程,您只能分配它的亲和性,那么您可以合理地希望进程/线程将在特定的逻辑CPU上执行。

从Vista / Server2003开始,您可以通过PInvoke GetCurrentProcessorNumber() Windows API方法( https://docs.microsoft.com/en-gb/windows/desktop/api/processthreadsapi/nf-processthreadsapigetcurrentprocessornumber )。

显然只有Windows,如果你计划支持其他平台,那就不理想了。

我不确定OP的用例是否理想,但在尝试创建一个在系统中保证唯一的时间戳时,它可能是合理的/有用的,即使所有处理器在同一时间计算一个。