我希望能够推出线程一大堆: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
),他们都在跑一次,而且事情效率不高。我该如何做类似的事情:启动所有线程,但只运行一些(比如我的计算机上的核心数量),当一个线程死亡时,启动另一个线程。
它被称为线程池 –
@BryanChen不真。典型的线程池有固定数量的线程正在运行,并且它们使用消息传递来请求并分配新任务。我确定线程本身被销毁/创建。我只想要一个固定数量的线程。这是一个微妙的差异(我不必担心用我的方式创建消息传递框架)。 –
创建/销毁线程和运行永久线程只是线程池的两种不同实现。创建线程非常昂贵,特别是如果任务很小并且线程创建经常发生。你需要的肯定是一个线程池。消息传递框架?线程池有很多种“消息传递框架”,但是一个非常简单的实现叫做“阻塞队列”。这很容易实现。 – pasztorpisti