2011-08-11 56 views
4

我有20個線程在我的程序中一次運行,(創建20等待他們完成,開始另一個20),過了一段時間我的程序慢下來。我需要釋放任務還是做特別的事情?如果是的話,如果不這樣做的話,爲什麼這樣的程序會減慢呢?如何「免費」一個線程

+0

它們是線程池線程還是明確地管理它們? – drharris

+0

你是如何創造你的thrads? – Mehran

+0

可能的重複:http://stackoverflow.com/questions/6960520/when-to-dispose-cancellationtokensource/6961264#6961264 –

回答

12

您可能想要考慮直接使用ThreadPool,或通過Task Parallel Library(我的首選選項)。這可能是一個更好,更簡單,更清潔的設計,而不是產生自己的線程並重復阻塞它們。這就是說,如果你的程序變得越來越慢,這是一個探查器可以大大幫助的東西。沒有看到代碼,診斷非常困難。例如,根據您所做的工作,您可能會導致GC隨着時間的推移變得效率低下,這可能會導致程序繼續執行時GC花費的時間百分比攀升。分析應該能夠讓您很好地指出程序執行時需要花費的時間。

1

裏德的答案可能是解決您的問題的最佳方法;然而,如果你確實想自己管理線程,而不是使用ThreadPool或TPL,那麼我不得不問,爲什麼你會讓20個線程死掉,再創建20個線程。創建線程是一個昂貴的過程,這就是線程池存在的原因。如果您持續擁有相同數量的並行任務或最大數量,則應該創建一次並重用。您可以使用鎖定結構(如信號量和互斥鎖),讓線程在完成時等待,只需給他們新數據即可處理並釋放它們以便再次進行。等待鎖定是一項非常便宜的操作 - 比重新創建線索便宜幾個數量級。

因此,例如,一個線程可能是這樣的(僞):

while (program_not_ending) 
{ 
    wait_for_new_data_release;  // Wait on thread's personal mutex 

    process_new_data; 

    resignal_my_mutex;    // Cause the beginning of loop to wait again 

    release_semaphore_saying_I_am_done; // Increment parent semaphore count 
} 

的父母會那麼等待它的信號量,以填補這20個線程完成,重置數據桶,並清除所有的線程互斥體。