執行緒池ThreadPool知識碎片和使用經驗速記

2021-09-06 13:12:17 字數 1081 閱讀 4324

threadpool(執行緒池)大概的工作原理是,初始時執行緒池中建立了一些執行緒,當應用程式需要使用執行緒池中的執行緒進行工作,執行緒池將會分配乙個執行緒,之後到來的請求,執行緒池都會盡量使用池中已有的這個執行緒進行響應,如果請求過多的話,執行緒池將會按照策略等待或者建立新的執行緒進行響應直到達到上限。當執行緒池中的執行緒處於空閒狀態一定時間後(具體多少看環境)執行緒池池內的空閒執行緒將會進行自我終結。

1、clr的乙個程序內會維護乙個執行緒池,執行緒池被該程序內所有應用程式域共享。託管執行緒池中的執行緒為後台執行緒, 即執行緒的isbackground屬性為true。這意味著在所有的前台執行緒都已退出後,threadpool 執行緒不會讓應用程式保持執行。

2、從.net4.0開始,程序的執行緒池的預設大小由虛擬位址空間的大小等多個因素決定,它的預設大小為每個可用處理器250個輔助線程,再加上1000個i/o完成執行緒。程序可以呼叫 getmaxthreads 方法以確定執行緒的數量。 使用 setmaxthreads 方法可以更改執行緒池中的執行緒數。 每個執行緒使用預設的堆疊大小並按照預設的優先順序執行。

3、執行緒池分為兩類,一類是work thread(計算密集型),一類是io thread(io密集型)。io密集型執行緒可以在不占用cpu的情況下通過裝置驅動程式進行io操作,比如帶begin***和end***方法的檔案操作、網路訪問等方法。這種帶begin/end的非同步操作寫法也就是熟知的asynchronous programming model (apm)模式。使用apm模式,呼叫begininvoke卻不呼叫endinvoke會使得執行緒資源無法**引發memory leak,高併發條件下會造成應用程式崩潰。

4、委託的begininvoke方法,本質上也是通過執行緒池完成工作的,所以我們熟知的func、action等委託,通過begininvoke的方式非同步呼叫方法,必須要寫對應的callback,因為呼叫begininvoke卻不呼叫endinvoke會使得執行緒資源無法**。

6、.net4.5自帶的async和await,就是基於.net4.0裡的task和parallel的再開發,歸根結底是呼叫task的語法糖,它們的實現也離不開執行緒池在背後的工作。

8、在多執行緒、非同步及並行操作中,異常處理必須非常小心,如果不捕獲會導致該執行緒所屬程序崩潰。

參考:<>

執行緒池 Thread Pool

烽驛2009開源實時通訊平台 原始碼獲取 svn checkouthttp fy2009.googlecode.com svn trunk fy2009 read only 眾所周知,執行緒並非越多越好,理論上乙個cpu 或core 乙個活動執行緒可獲得最佳效能。執行緒池可根據具體硬體的情況 如cp...

ThreadPool(執行緒池)

任務後台基礎 執行緒池。建立執行緒需要時間。如果有不同的短任務要完成,就可以事先建立許多執行緒,在應完成這些任務時發出請求,這個執行緒最好在需要更多的執行緒時增加,在需要釋放資源時減少。不需要自己建立這樣的乙個列表,該錶由threadpool類託管,這個類會在需要時增減池中線程的執行緒數,直到達到最...

ThreadPool 執行緒池

最近在做通訊的專案,裡面需要使用點執行緒池,這裡做下筆記,歡迎指點!執行緒池功能 應用程式可以有多個執行緒,net框架為每個程序提供了乙個執行緒池,乙個執行緒池有若干個等待操作狀態,當乙個等待操作完成時,執行緒池中的輔助線程會執行 函式。執行緒池中的執行緒由系統管理,程式設計師不需要費力於執行緒管理...