2010-07-29 33 views
5

我想知道是否有可能识别具有特定线程ID的线程使用的物理处理器(核心)?识别处理器(核心)被特定线程使用

例如,我有一个多线程应用程序有2个线程(例如,threadid = 10和threadid = 20)。我在具有双核处理器(核心1和核心2)的系统上运行应用程序。那么,如何知道threadid为20的线程使用的核心数呢?

P.S. Windows平台。

谢谢

丹尼斯。

回答

3

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

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

+0

谢谢你的回应,帕特里克!所以出现了另一个问题 - 是否有可能知道某个特定线程在特定内核上运行了多少时间? (例如,某些线程运行核心1上其时间片的20%,其80%的时间片运行在核心2上) – DenisL 2010-07-31 09:50:23

+0

不是我知道丹尼斯。你可以做的是限制一个线程到特定的核心(这称为线程亲和力)。也许你可以把你的进程分成多个线程,每个线程分配给一个内核。你能解释一下原来的问题吗? (导致你的原始问题)也许你的问题可以用另一种方式解决。 – Patrick 2010-08-01 21:08:34

+0

我的任务是创建两个函数: 1.第一个函数按特定线程ID返回总多核处理器使用情况。我已经使用性能计数器功能实现了该功能。 2.第二个函数按特定线程ID返回特定的核心使用率。我不知道如何创建函数,这似乎是不可能的。 – DenisL 2010-08-02 07:41:38

2

有些功能叫做GetCurrentProcessorNumber(可用于Server 2003和Vista)和GetCurrentProcessorNumberEx(自Server 2008 R2和Windows 7以后可用)。

有关更多相关选项和注意事项(包括Windows XP - 主要是this answer describing the use of cpuid instruction),另请参阅this question's answers

当然,核心号码可以随时由调度程序进行更改,所以如果您需要确定,那么如果您在核心号码前后都检查核心号码,则可能会有所帮助。时间量,并且如果核心编号仍然相同,那么您知道哪个核心最有可能还执行了中间代码。