如何判断线程运行的CPU?有没有办法确定给定线程在哪个CPU上运行?最好在C#中,但C++会这样做。.NETProcess和ProcessThread类似乎不提供此信息。ETA说明:我们正在开发一个服务器应用程序来处理http多播流并生成多个视频编码器。它在具有12个物理内核的系统上运行,从而产生24个逻辑CPU(超线程)。通过TaskManager和ProcessExplorer,我们验证了我们生成的进程在逻辑CPU之间均匀分布。但是,我们看到一个CPU上有很多(核心?)活动,这会占用异常多的CPU时间,从而造成干扰。我们正在尝试确定在这个特定CPU上运行的进程/线程。TaskManager和ProcessExplorer似乎都没有提供此信息。如果他们这样做,请解释这些信息是如何获得的。否则,我们正在考虑编写自己的工具来获取此信息。这是我们需要帮助的地方。我们知道如何更改线程亲和性(我们知道不能保证线程将与任何CPU保持关联,尽管在这种特殊情况下占用CPU的线程仍然只与一个CPU关联),但为了做到这一点,我们need首先判断哪个进程/线程需要重定位。这是这个问题的唯一目标。我希望这有助于澄清事情。在MSDN中,使用ProcessThread.ProcessorAffinity属性可以设置线程关联性,但无法获取它。默认情况下,线程没有关联(可以在任何处理器上运行)。使用系统;使用系统诊断;namespaceProcessThreadIdealProcessor{classProgram{staticvoidMain(string[]args){//确保有一个记事本实例正在运行。Process[]notepads=Process.GetProcessesByName("记事本");如果(notepads.Length==0)Process.Start("记事本");ProcessThreadCollection线程;//处理[]记事本;//检索记事本进程。notepads=Process.GetProcessesByName("记事本");//获取第一个实例的ProcessThread集合threads=notepads[0].Threads;//设置集合threads[0].IdealProcessor=0中第一个ProcessThread的属性;线程[0].ProcessorAffinity=(IntPtr)1;}}}同样,Thread.SetProcessorAffinity做同样的事情。这不能以连续和可靠的方式完成。操作系统任务调度程序优化线程并在可用的CPU内核之间分配负载。通常,线程可以在任何CPU上执行。此外,通过上下文切换,它还可以更改其CPU。如果你需要精确定位一个线程或进程,你只能分配它的亲和性,那么你就可以合理地希望进程/线程在特定的逻辑CPU上执行。从Vista/Server2003开始??,您可以通过PInvokeGetCurrentProcessorNumber()WindowsAPI方法(https://docs.microsoft.com/en-gb/windows/desktop/api/processthreadsapi/nf-processthreadsapigetcurrentprocessornumber)获取当前处理器编号。显然仅限Windows,如果您计划支持其他平台,则不理想。我不确定OP的用例是否理想,但在尝试创建保证在系统中唯一的时间戳时,即使所有处理器都在同时计算一个时间戳,它也可能是合理/有用的。以上就是C#学习教程:如何判断线程运行在哪个CPU上?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
