2010-11-16 70 views
2

我有一個問題...我需要建立一個應用程序的多線程,我的問題是:如果我有一個2cpu處理器,是自動的,我的2線程是分開的一個處理器? 如果我有4個線程,我的電腦有4cpu,每個處理器又是1個?如果我有4個處理器和2個cpus,如何分割?C++線程劃分到微處理器

在此先感謝

回答

7

這是不是真的可以,除非你至少指定操作系統來回答的問題。

C++本身一無所知線程,它們是由操作系統執行環境提供的服務,並依靠該操作系統爲它的實施上。

作爲一般的觀察,我敢肯定的是,Linux的調度線程獨立,使多個線程可以在不同的CPU和/或核心傳播。我懷疑Windows會這樣做。

有些OS」將允許您指定線程親和力,堅持使用單一的CPU,但同樣的能力線程(有時線程組),這是一個操作系統問題,而不是C++的。

對於Windows(根據您的評論),你可能需要閱讀this introduction。 Windows提供了一個SetProcessAffinityMask()函數用於控制給定進程中所有線程的關聯性,或用於控制獨立線程的SetThreadAffinityMask()

但是,通常情況下,你會發現這是最好的離開僅僅這些,讓OS排序出來 - 除非你有不同的行爲的特定需求,操作系統幾乎肯定會做出正確的決定。

+0

對不起,我用Visual C++和我創建第二個窗口 – ghiboz 2010-11-16 08:26:43

+0

+1我的程序的建議,只要你不真的需要它獨自離開的過程親和力掩碼。 (當讀取高精度時間是不幸的需要) – daramarak 2010-11-16 09:43:20

4

線程如何分配給處理器是特定於您的應用程序運行的操作系統。通常,大多數操作系統不會對你的線程在處理器中的分配方式做出任何保證,儘管一些操作系統有一些低級API允許你指定線程親和性。

+0

謝謝sean ...並且對於windows,您是否知道API? – ghiboz 2010-11-16 08:27:20

+0

我認爲這是SetThreadAffinityMask – Sean 2010-11-16 08:30:17

+1

@ghiboz:請注意,調用'SetThreadAffinityMask'的時候_quite_不常見。通常Windows可以比你做得更好,因爲它可以輕鬆地將所有進程中的所有線程考慮在內。 – MSalters 2010-11-16 08:57:11

2

如果你的線程是CPU綁定的,那麼他們肯定會傾向於在所有可用的CPU上安排。

如果您的線程是IO綁定的,那麼如果每個CPU只有一個線程,則大多數CPU將閒置。這就是爲什麼 - 當試圖最大化性能時 - 衡量正在發生的事情很重要,要麼找到每個CPU的硬編碼比率,要麼使用操作系統線程池機制,該機制可以訪問足夠的信息以保持儘可能多的線程因爲有CPU核心,所以是活動的。

您通常不希望擁有更多活動線程,即CPU(即未等待IO完成的線程)因爲CPU上活動線程之間切換的行爲確實會產生可累積的小成本。