首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何确定线程在哪个CPU上运行?

如何确定线程在哪个CPU上运行?
EN

Stack Overflow用户
提问于 2012-01-25 14:54:30
回答 3查看 7K关注 0票数 17

有没有一种方法可以确定给定的线程在哪个CPU上运行?最好是在C#中,但C++也可以。

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

ETA澄清:

我们正在开发一个服务器应用程序,用于处理http组播流并生成多个视频编码器。它在具有12个物理核心的系统上运行,从而产生24个逻辑CPU(超线程)。通过TaskManager和ProcessExplorer,我们已经验证了我们产生的进程均匀地分布在逻辑CPU上。然而,我们看到了很多(内核?)只有一个CPU上的活动会占用大量的CPU时间进行干扰。我们正在尝试确定哪些进程/thread正在这个特定的CPU上运行。TaskManager和ProcessExplorer似乎都没有提供这方面的信息。如果有,请解释如何获得这些信息。

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

我们知道如何更改线程亲和性(我们也知道不能保证线程将与任何CPU保持关联,尽管在这种特定情况下,占用CPU的线程仍然只与一个CPU关联),但为了这样做,我们需要首先确定需要重新定位哪个进程/线程。这是这个问题的唯一目的。

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

EN

回答 3

Stack Overflow用户

发布于 2012-01-25 15:01:09

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

代码语言:javascript
复制
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也做同样的事情。

票数 4
EN

Stack Overflow用户

发布于 2012-01-25 23:53:34

这不可能以一种持续可靠的方式来实现。操作系统任务调度程序优化线程,并在可用CPU核心之间拆分负载。在一般情况下,线程可以在任何CPU上执行。此外,通过上下文切换,它还可以改变它的CPU。

如果您需要指定特定的线程或进程,则只能分配其亲和性,因此您可以合理地希望该进程/线程将在特定的逻辑CPU上执行。

票数 2
EN

Stack Overflow用户

发布于 2018-09-12 23:32:11

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

显然,它仅适用于Windows,因此如果您计划支持其他平台,则并不理想。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8998895

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档