2010-01-31 139 views
1

如何控制我的程序正在處理的線程數?多線程線程控制

我有一個程序,現在準備mutithreading但一個問題是,這項計劃是非常內存密集型,我必須要限制運行,這樣我就不會用完RAM的線程數。主程序通過並創建一大堆處於暫停狀態的句柄和相關的線程。

我想程序啓動線程的一組號碼,當一個線程完成,直到所有的工作已經完成,它會自動解除暫停行中的下一個線程。我該怎麼做呢?

有人曾經提到一些有關使用一個線程處理,但我似乎無法找到關於如何寫一個或會究竟是如何工作的任何信息。

如果任何人都可以提供幫助,將不勝感激。

使用windows和visual C++。 注意:我不需要擔心與線程訪問的傳統問題,每個線程都是完全獨立的,它更像批處理,而不是程序的真正的多線程處理。

感謝,

-Faken

回答

2

不明確創建線程。創建一個線程池,請參閱Thread Pools並使用QueueUserWorkItem排隊工作。線程池大小應該由可用硬件線程的數量(內核數量和超線程比率)以及您的工作項目所執行的CPU與IO的比率來確定。通過控制線程池的大小,您可以控制最大併發線程數。

0

這裏有這麼多話要說。
有幾種方法
您應該只創建多達你打算在同一時間運行的線程處理,然後當他們完全重複使用。 (查找線程池)。
這保證你永遠不會有太多的同時運行。這提出了一個線程完成時出資的問題。您可以在線程終止之前調用一個回調函數,該回調函數中的參數就是剛剛完成的線程句柄。使用Boost綁定和提升信號。當回調被調用時,查找該線程句柄的另一個任務並重新啓動該線程。這樣你所要做的就是添加到「要做的任務」列表中,並且回調會爲你刪除任務。不需要輪詢,也不用擔心太多的線程。

2

暫停的線程不使用的CPU資源,但它仍然消耗內存,所以你真的不應該創建多個線程比你想同時運行。

最好只有最多同時執行任務數量的線程,並使用隊列將工作單元傳遞到工作線程池。

您可以將工作交給使用Windows Thread Pool API由Windows創建的標準線程池。

請注意,您將與您的流程中的所有代碼共享這些線程和用於向他們提交工作的隊列。如果出於某種原因,您不想與您的流程中的其他代碼共享您的工作線程,那麼您可以創建一個FIFO queue,創建儘可能多的線程,以便同時運行並讓它們中的每一個都拉出工作項目不在隊列中。如果隊列爲空,它們將阻塞,直到工作項添加到隊列中。