我有20個線程在我的程序中一次運行,(創建20等待他們完成,開始另一個20),過了一段時間我的程序慢下來。我需要釋放任務還是做特別的事情?如果是的話,如果不這樣做的話,爲什麼這樣的程序會減慢呢?如何「免費」一個線程
4
A
回答
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個線程完成,重置數據桶,並清除所有的線程互斥體。
相關問題
- 1. 保持UI線程免費
- 2. 如何讓一個java程序ide免費
- 3. 免費一個指向struct
- 4. 如何檢查固定線程池中的所有線程都是免費的?
- 5. 免費和付費的應用程序簽署了一個keystore
- 6. 免費在線UML工具
- 7. 什麼是一些免費的在線流程圖工具?
- 8. Abaqus免費免費分析?
- 9. 如何給每個用戶一個免費的跟蹤期
- 10. 如何製作Android應用程序的免費/付費版本?
- 11. 如何免費贈送我的付費Android應用程序?
- 12. 如何維護應用程序的付費和免費版本
- 13. 如何免費下訂單
- 14. 如何免費使用appsrc?
- 15. 我如何免費ostringstream?
- 16. 如何在Magento免費送貨時隱藏統一費率
- 17. 如何增加Jqgrid的字體大小(免費版)/免費jqGrid
- 18. iPhone應用程序免費和付費
- 19. 如何從同一個應用的免費和付費版本訪問文件?
- 20. 如何在一個國家免費申請並在其他國家付費?
- 21. Fabric.js - 免費繪製一個矩形
- 22. 尋找一個免費的替代ProjectPlace
- 23. 免費一個覆蓋指針
- 24. 第一個免費的MFC資源ID
- 25. Woocommerce統一費率和免費送貨
- 26. angularjs免費視頻教程
- 27. C編程 - Malloc /免費
- 28. 免費()崩潰程序
- 29. 遠程(免費)SVN主機
- 30. 點免費程序組成
它們是線程池線程還是明確地管理它們? – drharris
你是如何創造你的thrads? – Mehran
可能的重複:http://stackoverflow.com/questions/6960520/when-to-dispose-cancellationtokensource/6961264#6961264 –