2010-10-27 21 views
-2

我想知道,pthreads-win32(pthreads的windows實現)如何實現交叉線程?它是專門用Windows API編寫的嗎?我檢查了一些源代碼,似乎大多數確實是用windows API編寫的,我想知道它是否使用Windows調度程序在線程(和核心)之間切換,或者它是否實現它自己的?具體來說,現在大多數處理器都實現了自己的調度器(例如,我已經閱讀了關於itanium arch的內容,硬連線邏輯支持每個內核兩個線程,甚至可以通過hw邏輯在它們之間自動切換,所以很顯然OS支持多核並不一定需要),所以如果我有一個像Windows 32位或不支持多核處理器的過時操作系統,使用pthreads-win32編寫的程序仍然可以運行在多個處理器內核上,或者只運行一個內核用過的?pthreads如何進行交叉線程和調度

pthreads實現(untainted posix線程)如何?即使它們運行的​​操作系統不支持多核處理器嗎?

我猜測答案是否定的,對於windows和posix版本,如果操作系統不支持多核,那麼只有一個內核正在使用。這只是一個受過教育的猜測,我想確認一下,所以請留下評論。

在一個方面的請求,你可以推薦一個支持多核心線程執行的lib,即使程序運行的OS不是。如果有任何c。

另外,有沒有一種方法可以確保使用pthreads寫入的兩個線程在不同的核心上執行,或者操作系統(或處理器或pthreads庫)是否自動執行分配? pthreads是否保證在不同內核上執行?

乾杯,纈氨酸

編輯: 我知道大多數的這些問題,是實現特定的,所以我指的是這個實現並行線程的窗戶http://sourceware.org/pthreads-win32/。我之前沒有具體提及它,因爲據我所知,這是Windows中最流行和廣泛使用的pthreads實現。

回答

1

所以從我所得到的,最重要的是要注意的是,線程與並行性(如多核處理器的UMA)很少有關。所以雖然線程可能是一種實現併發的技術,但它不是確保ACTUAL並行執行的一種方式,這正是我一直在尋找的,因爲我正在研究並行和分佈式系統和算法。

所以一次回答一個問題。是的,pthreads,可能大多數(如果不是全部的話)其他線程API都基於底層OS API。哪一個給他們的操作系統具有相同的限制。意思是,如果操作系統(具體來說,在這種情況下,某些窗口運行例如pthreads-win32)不支持多個內核,則始終只有一個內核正在使用。正如在nob提供的wiki頁面上指出的那樣,引用:「超線程不僅要求操作系統支持多個處理器,而且還要特別針對HTT進行優化,並且Intel建議在使用具有HTT的操作系統時禁用HTT沒有如此優化。「 http://en.wikipedia.org/wiki/Hyper-threading在大多數情況下,只有硬連線處理器(基本)調度程序不足以利用多核,它必須由SW(OS支持)支持/使用。雖然這可能不是一個明確的證據,但我相信足夠的證據指向相同的方向來證實這一點。

我沒有通過pthreads(對於兼容posix的操作系統)源代碼進行篩選,我猜這個API也是一樣,因爲它更可能使用底層OS API。你必須自己確認。 :)

而且,任何潛在的庫,在那裏,可以支持多個內核上執行,即使在它們正運行在不支持多內核的操作系統,你必須找到他們自己的(如果他們存在),請留下評論。

爲了確保平行度(在不同核心上執行)手動,Linux確實提供了一種針線程到特定的虛擬處理器(在一定條件下)。要將整個過程固定到特定的(虛擬)處理器/內核,可以使用sched_setaffinity()(來自sched.h)。正如nos指出的那樣,pthreads提供了pthread_setaffinity_np()來將特定的線程固定到特定的核心。 Windows支持與SetThreadAffinityMask()類似的功能,因此很明顯,可以手動將線程分配到不同內核上並行運行(如果操作系統支持多內核)。如果你爲使用多線程(超過2)的代碼編寫代碼,它們應該在多個物理內核上執行(如果可用的話)(這可能是pthread使用的操作系統功能) 。

我的問題是相當普遍的,首先,因爲這些東西大部分都是指定,很難給出一個答案。我希望這個答案足夠詳細,可以幫助你澄清一些事情。

乾杯,Val

+0

大多數操作系統都提供了一種將線程固定到不同內核的方法。你可以使用pthread_setaffinity_np() – nos 2010-10-28 18:10:18

+0

將一個特定的線程分配給一個核心。謝謝。你是對的,我正在傳播錯誤信息(在另一篇文章中發現)。 Linux確實提供了一種將線程固定到特定虛擬處理器(在特定條件下)的方法。實際上,我在sched_setaffinity()之前(來自sched.h)遇到過,它基本上做了同樣的事情,除了將整個進程固定到核心。無論如何,windows支持與SetThreadAffinityMask()類似的功能,很明顯,可以手動將線程分配到不同內核上並行運行(如果操作系統支持多內核)。我會在早上糾正我的上述帖子:) Greets – valekovski 2010-10-29 00:33:58

0

通常,每個現代操作系統都支持線程本身,並將它們調度到系統的不同(虛擬)內核。操作系統提供了一些通用的同步技術(如Mutexes或Semaphores或Barriers),pthread使用它們來實現pthreads API。

在某些英特爾處理器(如Itanium)上,每個內核有兩個線程(我認爲您的意思是超線程),因此操作系統會看到兩個「虛擬」內核。處理器的確將兩個線程調度到一個物理內核上。 (請參閱Wikipedia

但是,有些示例中Runtime-Plattforms實現了自己的Thread-Conceptepts並執行了調度:我想到(至少較舊的)Java實現具有它們自己的調度例程。

+0

嗨。我已經遇到了您提到的維基頁面,但我錯過了相關信息。每個物理核心有兩個VIRTUAL核心,謝謝。這實際上回答了我的另一個問題(爲什麼我的程序的線程版本運行速度較慢,然後是非線程,我創建了2個線程,因爲我認爲,對於核心二重奏來說更多是浪費:))。另外,是的,java DOES實現了它自己的線程和調度概念,但它仍然使用底層操作系統來構建這個抽象,所以它受到相同操作系統內部部件的阻礙。參考:http://www.janeg.ca/scjp/threads/scheduling.html – valekovski 2010-10-27 20:16:45