微軟msdn社群,原文為英文)
乙個執行緒池是乙個可以完成一系列當前環境下任務的執行緒的集合,他能夠釋放主線程去執行新的非同步任務
執行緒池常常被用在伺服器的應用程式上,每乙個進入的請求被分配給執行緒池中的乙個執行緒,所以每個請求可以被非同步的處理而不用繫結到主線程或者延遲後續的請求處理
一旦執行緒池中的乙個執行緒完成了任務就會馬上返回到等待執行緒的佇列中,在這裡執行緒可以被復用。這種復用能夠避免應用程式建立新的執行緒的額外開銷
執行緒池特別的有個執行緒的最大值,如果所有的執行緒都是忙碌的。附加的任務會被放置到佇列中知道有執行緒完成任務可以來執行這些任務
你可以實現你自己的執行緒池,但是使用.net framework提供的threadpool class會更加簡單
下面的是乙個利用.net framework threadpool計算費波拉契數列的例子,每個費波拉契的結果被乙個費波拉契的類所表示,這個類提供了乙個方法——threadpoolcallback,這個方法用來執行計算操作,乙個object代表每個費波拉契物件的值被建立。這個方法被傳遞到threadpool的queueuserworkitem中,這個方法用來分配可用的執行緒來執行方法
因為每個費波拉契物件被賦予乙個隨機數來計算結果,而且10個執行緒都在爭用cpu時間,所以我們沒有辦法事先知道完成所有10個執行緒所要花費的時間。這就是為什麼每個費波拉契物件在建構函式中都會分配乙個manualresetevent物件,用來標誌計算完成,這個物件用來讓主線程使用waiall方法阻塞操作直到所有10個執行緒都完成計算。然後由主線程顯示結果
using system;
using system.threading;
public class fibonacci
public void threadpoolcallback(object threadcontext)
started...", threadindex);
_fibofn = calculate(_n);
console.writeline("thread result calculated...", threadindex);
_doneevent.set();
}// recursive method that calculates the nth fibonacci number.
public int calculate(int n)
return calculate(n - 1) + calculate(n - 2);
}public int n }
private int _n;
public int fibofn }
private int _fibofn;
private manualresetevent _doneevent;
}public class threadpoolexample
tasks...", fibonaccicalculations);
for (int i = 0; i < fibonaccicalculations; i++)
// 等待執行緒池中所有計算完成
waithandle.waitall(doneevents);
console.writeline("all calculations are complete.");
// display the results...
for (int i = 0; i < fibonaccicalculations; i++)
) = ", f.n, f.fibofn);}}
}
使用boost中的執行緒池
呵呵,今天要寫乙個效能測試的程式,由於之前用過boost的thread,所以就採用了boost的thread庫 程式大概是根據指定的引數來生成多個執行緒來進行乙個操作 本來滿簡單的.但是之前時候不知道boost有程序組的支援 所以只能自己動態的建立一大堆 thread 放到乙個容器中.然後在遍歷jo...
執行緒池的使用
簡而言之 兩個類 執行緒池的 類 public class threadpoolproxyfactory return mnormalthreadpoolproxy return public static threadpoolproxy createdownloadthreadpoolproxy ...
執行緒池的使用
執行緒池能幫助我們有效的管理執行緒,避免重複的建立銷毀執行緒。newfixedthreadpool 固定執行緒數量的執行緒池 newsinglethreadexecutor 返回乙個只有乙個執行緒的執行緒池 newcachedthreadpool 返回乙個可根據實際情況調整執行緒數量的執行緒池 ne...