APUE:線程:線程池的實現

什麼是線程池?

諸如web服務器、數據庫服務器、文件服務器和郵件服務器等許多服務器應用都面向處理來自某些遠程來源的大量短小的任務。構建服務器應用程序的一個過於簡單的模型是:每當一個請求到達就創建一個新的服務對象,然後在新的服務對象中爲請求服務。但當有大量請求併發訪問時,服務器不斷的創建和銷燬對象的開銷很大。所以提高服務器效率的一個手段就是儘可能減少創建和銷燬對象的次數,特別是一些很耗資源的對象創建和銷燬,這樣就引入了“池”的概念,“池”的概念使得人們可以定製一定量的資源,然後對這些資源進行復用,而不是頻繁的創建和銷燬。

線程池是預先創建線程的一種技術。線程池在還沒有任務到來之前,創建一定數量的線程,放入空閒隊列中。這些線程都是處於睡眠狀態,即均爲啓動,不消耗CPU,而只是佔用較小的內存空間。當請求到來之後,緩衝池給這次請求分配一個空閒線程,把請求傳入此線程中運行,進行處理。當預先創建的線程都處於運行狀態,即預製線程不夠,線程池可以自由創建一定數量的新線程,用於處理更多的請求。當系統比較閒的時候,也可以通過移除一部分一直處於停用狀態的線程。

線程池的注意事項

雖然線程池是構建多線程應用程序的強大機制,但使用它並不是沒有風險的。在使用線程池時需注意線程池大小與性能的關係,注意併發風險、死鎖、資源不足和線程泄漏等問題。

(1)線程池大小。多線程應用並非線程越多越好,需要根據系統運行的軟硬件環境以及應用本身的特點決定線程池的大小。一般來說,如果代碼結構合理的話,線程數目與CPU 數量相適合即可。如果線程運行時可能出現阻塞現象,可相應增加池的大小;如有必要可採用自適應算法來動態調整線程池的大小,以提高CPU 的有效利用率和系統的整體性能。

(2)併發錯誤。多線程應用要特別注意併發錯誤,要從邏輯上保證程序的正確性,注意避免死鎖現象的發生。

(3)線程泄漏。這是線程池應用中一個嚴重的問題,當任務執行完畢而線程沒能返回池中就會發生線程泄漏現象。

簡單線程池的設計

    下面是一個簡單線程池的實現。它的方案是這樣的:程序啓動之前,初始化線程池,啓動線程池中的線程,由於還沒有任務到來,線程池中的所有線程都處在阻塞狀態,當一有任務到達就從線程池中取出一個空閒線程處理,如果所有的線程都處於工作狀態,就添加到隊列,進行排隊。如果隊列中的任務個數大於隊列的所能容納的最大數量,那就不能添加任務到隊列中,只能等待隊列不滿才能添加任務到隊列中。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章