2014-02-27 126 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年