我有一個處理大塊信息的子例程。爲了利用整個CPU,它將工作劃分爲單獨的線程。所有線程完成後,結束。我讀過創建和銷燬線程使用大量開銷,所以我嘗試使用線程池,但實際上運行速度比創建自己的線程慢。如何在程序運行時創建自己的線程,然後繼續重用它們?我見過一些人說它不能完成,但是線程池是這樣做的,所以它一定是可能的,對吧?如何在.NET 3.5中重用線程
這裏是啓動新線程的部分代碼/使用線程池:
//initialization for threads
Thread[] AltThread = null;
if (NumThreads > 1)
AltThread = new Thread[pub.NumThreads - 1];
do
{
if (NumThreads > 1)
{ //split the matrix up into NumThreads number of even-sized blocks and execute on separate threads
int ThreadWidth = DataWidth/NumThreads;
if (UseThreadPool) //use threadpool threads
{
for (int i = 0; i < NumThreads - 1; i++)
{
ThreadPool.QueueUserWorkItem(ComputePartialDataOnThread,
new object[] { AltEngine[i], ThreadWidth * (i + 1), ThreadWidth * (i + 2) });
}
//get number of threads available after queue
System.Threading.Thread.Sleep(0);
int StartThreads, empty, EndThreads;
ThreadPool.GetAvailableThreads(out StartThreads, out empty);
ComputePartialData(ThisEngine, 0, ThreadWidth);
//wait for all threads to finish
do
{
ThreadPool.GetAvailableThreads(out EndThreads, out empty);
System.Threading.Thread.Sleep(1);
} while (StartThreads - EndThreads > 0);
}
else //create new threads each time (can we reuse these?)
{
for (int i = 0; i < NumThreads - 1; i++)
{
AltThread[i] = new Thread(ComputePartialDataOnThread);
AltThread[i].Start(new object[] { AltEngine[i], ThreadWidth * (i + 1), ThreadWidth * (i + 2) });
}
ComputePartialData(ThisEngine, 0, ThreadWidth);
//wait for all threads to finish
foreach (Thread t in AltThread)
t.Join(1000);
foreach (Thread t in AltThread)
if (t.IsAlive) t.Abort();
}
}
}
ComputePartialDataOnThread只是解包的信息,並調用ComputePartialData。將被處理的數據在線程中共享(它們不會嘗試讀取/寫入相同的位置)。 AltEngine []是每個線程的獨立計算引擎。
該操作使用線程池運行約10-20%。
你可以發佈你的代碼,以便我們可以看到你在做什麼?有可能你在線程池中做了一些錯誤,導致它很慢。 – 2011-04-29 01:42:06
也許它只在你的測試運行中很慢,也就是說你點擊了最初的線程數,所以它必須創建更多的線程來滿足你的需求。在運行任何測試之前,嘗試手動設置池中的最小線程數。 – 2011-04-29 01:50:55
線程的數量意味着匹配處理器內核的數量。在這種情況下,它只有2. – HypnoToad 2011-04-29 02:07:29