2014-02-27 167 views
3

我希望能夠推出線程一大堆:C++ 11線程隊列

futures_que< std::future<ret_value> > fq; 

for (auto a: some_very_large_container) 
    fq.push_back(std::async(std::launch::async, some_computationally_expensive_function, a)); 

std::vector<ret_value> values; 
for (auto f: fq) { 
    f.wait(); 
    values.push_back(f.get()); 
} 

但是,如果我這樣做天真地(說與futures_que是一個std::vector),他們都在跑一次,而且事情效率不高。我該如何做類似的事情:啓動所有線程,但只運行一些(比如我的計算機上的核心數量),當一個線程死亡時,啓動另一個線程。

+3

它被稱爲線程池 –

+0

@BryanChen不真。典型的線程池有固定數量的線程正在運行,並且它們使用消息傳遞來請求並分配新任務。我確定線程本身被銷燬/創建。我只想要一個固定數量的線程。這是一個微妙的差異(我不必擔心用我的方式創建消息傳遞框架)。 –

+1

創建/銷燬線程和運行永久線程只是線程池的兩種不同實現。創建線程非常昂貴,特別是如果任務很小並且線程創建經常發生。你需要的肯定是一個線程池。消息傳遞框架?線程池有很多種「消息傳遞框架」,但是一個非常簡單的實現叫做「阻塞隊列」。這很容易實現。 – pasztorpisti

回答

1

標準C++將添加when_any()函數作爲future的隊列。請參閱後續文件。

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3784.pdf

+0

'wait_any()'不會在該文件的文本搜索中顯示。你的意思是'when_any()'? –

+0

此外,'when_any()'似乎做我不想要的東西......它等待一切完成,但不區分正在運行的東西。 –

+0

>你的意思是when_any()? 啊是的,'when_any()'。辨析? –

0

路過的std ::推出::異步|的std ::推出::推遲到標準::異步像

std::async(std::launch::async | std::launch::deferred, some_computationally_expensive_function) 

確實在Visual Studio 2013的伎倆,但由於Visual Studio中沒有做2015年