我想知道是否有可能識別具有特定線程ID的線程使用的物理處理器(核心)?識別處理器(核心)被特定線程使用
例如,我有一個多線程應用程序有2個線程(例如,threadid = 10和threadid = 20)。我在具有雙核處理器(核心1和核心2)的系統上運行應用程序。那麼,如何知道threadid爲20的線程使用的核心數呢?
P.S. Windows平臺。
謝謝
丹尼斯。
我想知道是否有可能識別具有特定線程ID的線程使用的物理處理器(核心)?識別處理器(核心)被特定線程使用
例如,我有一個多線程應用程序有2個線程(例如,threadid = 10和threadid = 20)。我在具有雙核處理器(核心1和核心2)的系統上運行應用程序。那麼,如何知道threadid爲20的線程使用的核心數呢?
P.S. Windows平臺。
謝謝
丹尼斯。
除非您使用線程關聯,否則線程不會分配給特定的核心。使用每個時間片,線程可以在不同的內核上執行。這意味着如果將有一個函數來獲取線程的核心,那麼在獲得返回值時,線程已經在另一個核心上執行的可能性很大。
如果您使用的是線程關聯,則可以查看Windows線程關聯功能(http://msdn.microsoft.com/en-us/library/ms684847%28v=VS.85%29.aspx)。
有些功能叫做GetCurrentProcessorNumber
(可用於Server 2003和Vista)和GetCurrentProcessorNumberEx
(自Server 2008 R2和Windows 7以後可用)。
有關更多相關選項和注意事項(包括Windows XP - 主要是this answer describing the use of cpuid instruction),另請參閱this question's answers。
當然,核心號碼可以隨時由調度程序進行更改,所以如果您需要確定,那麼如果您在覈心號碼前後都檢查覈心號碼,則可能會有所幫助。時間量,並且如果核心編號仍然相同,那麼您知道哪個核心最有可能還執行了中間代碼。
謝謝你的迴應,帕特里克!所以出現了另一個問題 - 是否有可能知道某個特定線程在特定內核上運行了多少時間? (例如,某些線程運行核心1上其時間片的20%,其80%的時間片運行在覈心2上) – DenisL 2010-07-31 09:50:23
不是我知道丹尼斯。你可以做的是限制一個線程到特定的核心(這稱爲線程親和力)。也許你可以把你的進程分成多個線程,每個線程分配給一個內核。你能解釋一下原來的問題嗎? (導致你的原始問題)也許你的問題可以用另一種方式解決。 – Patrick 2010-08-01 21:08:34
我的任務是創建兩個函數: 1.第一個函數按特定線程ID返回總多核處理器使用情況。我已經使用性能計數器功能實現了該功能。 2.第二個函數按特定線程ID返回特定的核心使用率。我不知道如何創建函數,這似乎是不可能的。 – DenisL 2010-08-02 07:41:38