2011-04-11 60 views
4

我讀了很多.Net資源,告訴我應該使用線程池線程,而不是自己實例化一個新線程。他們說你應該這樣做,因爲實例化一個新線程是一個昂貴的操作。線程創建過程中會發生什麼,使其成爲昂貴的操作?爲什麼創建一個新線程昂貴?

+3

那麼,一方面,運行時爲新線程的堆棧空間分配1 MB的內存...... – 2011-04-11 20:01:06

回答

16

一切都是相對的。創建一個新的線程是昂貴的...相對於不創建一個。如果你沒有在每個線程上做很多工作,涉及構建和拆除線程的工作可能會佔用你CPU時間的一部分。但是相對於創建一個新的進程而言,特別是在Windows上,這是很便宜的。

使用線程池通常更好,因爲它被調整爲幫助您避免一次激活太多的線程。你很少需要一次激活多個線程,否則你將花費大量的時間在它們之間執行上下文切換。使用線程池可以爲您管理這些,因爲在工作線程準備就緒之前,其他請求會排隊。

+3

如果一個任務需要很長時間才能完成而不會阻塞,那麼使用線程池將避免必須分割太多線程中的CPU都想同時運行。但是,如果預計某個任務會阻塞,則應該將其作爲單獨的線程運行。 – supercat 2011-04-11 20:55:04

4

默認情況下,每個線程獲取1 MB的內存分配。這可能很快變得昂貴。

1

有幾個因素。提到的一個是堆棧的內存。由於堆棧內存不是由用於對象的普通GC分配器處理的,因此創建線程堆棧然後放棄堆棧與創建價值不大的堆對象並放棄它們非常不同。

尚未提及的另一個因素是與線程靜態變量等相關的成本。在一些需要所有線程靜態變量的系統中,一個線程可能會在線程啓動之前被定義,啓動一個新線程需要初始化所有的線程靜態變量。因爲.net允許線程動態添加線程靜態變量,所使用的數據結構是不同的。儘管如此,線程啓動時初始化這些數據結構並不是免費的。

1

線程池不僅是關於分攤線程創建和銷燬的成本,而且不僅僅是關於用較少的棧來節省內存。它的真正好處是避免了同時擁有太多活動線程,並且如果運行服務器應用程序,則最小化上下文切換。即使你沒有編寫服務器應用程序,threadpool只是一個比線程更好的抽象 - 開始異步操作,完成時得到通知,或完成時執行回調,並讓OS或運行時找出要創建的線程數。

相關問題