2010-12-04 127 views
3

boost::thread庫中,是否有任何機制來控制同時運行多少個線程(最多)?boost :: thread:如何啓動所有線程,但一次只能運行n個?

在我而言,這將是最方便的開始N線程都在同一時間(N可以是幾百或幾千個):

std::vector<boost::thread*> vec; 
for (int i = 0; i < N; ++i) { 
    vec.push_back(new boost::thread(my_fct)); 
} 
// all are running, now wait for them to finish: 
for (int i = 0; i < N; ++i) { 
    vec[i]->join(); 
    delete vec[i]; 
} 

但我想推動一個最大的透明設置比如說,一次運行4個線程。 (我共享一個8核心機器,所以我不應該一次運行超過4個)。

當然,我可以照顧每次只能啓動4個,但是解決方案我問的問題會更透明,最方便。

回答

3

不要以爲Boost.Thread內置了這個功能,但是你可以將Boost.Threadpool(而不是官方庫)覆蓋到Boost.Thread上,並且允許你通過SizePolicy控制線程數。

默認值是fixed-size pool這就是你想要的 - 指定threadpool構造函數的初始(和正在進行的)線程數。

3

你真正想要的東西,似乎只會有4個線程,每個線程會處理很多作業

實現此目的的一種方法是根據需要產生儘可能多的線程,然後爲每個線程的運行循環從存儲線程安全的隊列結構中獲取任務(通常是函數對象或指針)一切需要完成的事情。

這樣可以避免創建大量線程的開銷,並且仍然保持相同的併發量。

1

您可以創建一個鎖,您只能獲得n次。然後每個線程在處理之前都必須獲取鎖(阻塞)。