确定特定线程使用的处理器(核心)

6
我想知道是否有可能通过特定thread-id识别线程使用的物理处理器(核心)?
例如,我有一个多线程应用程序,其中有两个线程(thread-id = 10和thread-id = 20,例如)。我在一个具有双核处理器(core 1和core 2)的系统上运行该应用程序。那么,如何获取使用thread-id = 20的线程所在的核心编号?
注:适用于Windows平台。
谢谢,
Denis.
2个回答

7

除非您使用线程亲和性,否则线程不会分配到特定的核心。 在每个时间片中,线程可以在不同的核心上执行。 这意味着,如果有一个函数来获取线程所在的核心,那么在您获得返回值时,该线程很可能已经在另一个核心上执行了。

如果您正在使用线程亲和性,则可以查看Windows线程亲和性功能 (http://msdn.microsoft.com/en-us/library/ms684847%28v=VS.85%29.aspx)。


谢谢您的回复,Patrick!所以又出现了另一个问题——是否有可能知道特定线程在特定核心上运行的时间?(例如,某个线程在 1 号核心上运行其时间片的 20%,并在 2 号核心上运行其时间片的 80%)。 - DenisL
我不知道有没有这样的功能,Denis。你可以将一个线程限制在特定的核心上(这被称为线程亲和性)。也许你可以将进程分成多个线程,每个线程分配到一个核心上。你能解释一下原始问题是什么吗?(导致你最初提出这个问题)也许你的问题可以用另一种方式解决。 - Patrick
我被委派创建两个函数:
  1. 第一个函数返回特定线程ID的总多核处理器使用情况。 我已经使用性能计数器函数实现了该功能。
  2. 第二个函数返回特定线程ID的特定核心使用情况。 我不知道如何创建该函数,似乎不可能实现。
- DenisL
我也认为这是不可能的。 - Patrick

3

有一些功能被称为GetCurrentProcessorNumber(自从Server 2003和Vista可用)和GetCurrentProcessorNumberEx(自从Server 2008 R2和Windows 7可用)。

还可以参考这个问题的答案了解更多相关选项和注意事项(包括Windows XP - 主要是这个回答描述了cpuid指令的使用)。

当然,核心数可以随时由调度程序更改,因此,如果您需要确保,则可以在测量或执行短时间后检查核心数,在核心数仍相同的情况下,您就知道最可能也在哪个核心上执行了中间代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接