2011-02-07 139 views
3

您認爲線程池設計模式是多核未來的方式嗎?線程池和多核系統

甲threadpooling文庫,例如,如果廣泛使用,使得/強制應用程序寫入器

(1)〜把問題分解成單獨的並行作業因此促進(實施:))並行

(2)通過從所有低級操作系統調用中抽象出來,同步等等,使程序員的生活更輕鬆。 (特別是C程序員:))

我都堅信它的最佳方式(或一個「最佳」的方式:))針對多核的未來......

所以,我的問題是,我是寫這樣想的還是我在一些錯覺:)

問候,

微內核

+0

這個問題有點不清楚。關於SO的指導原則是每個問題應該有一個明確的正確答案(一旦發現,如果有的話)。我建議製作這個社區維基,因爲這是一個有趣的話題,但如同一個問題一樣,它是一個討論話題。 – 2011-02-07 18:03:33

回答

6

線程池是一個涉及到一個隊列,並以多個線程的技術,其他任務來自隊列中的作業並處理它們。這與每當新任務到達時纔開始新線程的技術形成對比。

好處是,線程的最大數量是有限的避免太多線程,並且有任何新的任務涉及較少的開銷(線程已經運行,並採取任務。啓動無需威脅)。

這是否是一個好的設計高度取決於你的問題。如果你有很多短期工作以非常快的速度進入你的程序,那麼這是一個好主意,因爲較低的開銷是一個好處。如果你有大量的併發任務,這是一個好主意,讓你的調度程序不必做太多的工作。

有很多地方線程池是沒有用的。所以你不能一概而論。有時多線程是不可能的。或者甚至不需要,因爲多線程會在您的代碼中添加一個難以預測的元素(競爭條件),這是非常難以調試的。

線程池庫很難「強制」使用它。你仍然需要思考的東西,如果你只是開始一個線程...不會幫助。

1

對於Windows NT引擎線程池通常遠比I/O完成端口效率低。這些在許多問題和答案中都有廣泛的介紹。 IOCP支持事件驅動處理,因爲多個線程可以等待IOCP,直到由於套接字或處理器上的IOC(讀取或寫入)而發生事件,然後排隊等待IOCP。 IOCP依次將等待的線程與事件的ID進行配對,並釋放該線程進行處理。在線程處理了事件並啓動了一個新的I/O之後,它返回到IOCP等待下一個事件(這可能是也可能不是它剛剛啓動的I/O的完成)。

國際石油公司也可能通過從非事件明確發佈人爲地發出信號。

使用IOCP不是輪詢。最佳的IOCP實現將具有等待IOCP的線程數量,因爲系統中有內核。如果線程被認爲是有效的,那麼所有線程都可以執行相同的物理代碼由於一個線程從一個IOC處理直到它發出一個I/O,它不會強制它等待其他資源,除了可能競爭訪問線程安全區域。擺脫「每個線程一個句柄」範例是自然選擇。因此IOCP控制的線程與程序員能夠構建它們一樣高效。

0

我非常喜歡@yaankee的答案,除了我會爭辯說線程池幾乎總是正確的路要走。原因是:線程池可以退化爲一個簡單的靜態工作分區模型,用於矩陣 - 矩陣乘法等問題。 OpenMP引導就是這樣。