我的应用程序需要一个线程池,并且我想尽可能依赖标准(C++11 或 boost)的东西。我意识到有一个非官方的(!)boost线程池类,它基本上解决了我所需要的,但是我宁愿避免它,因为它不在boost库本身中 - 为什么它仍然不在核心库中很多年?
在此页面和其他地方的一些帖子中,人们建议使用 boost::asio 来实现类似线程池的行为。乍一看,这看起来像是我想要做的,但是我发现我所见过的所有实现都无法加入当前活动的任务,这使得它对我的应用程序毫无用处。为了执行连接,它们向所有线程发送停止信号,然后连接它们。然而,这完全抵消了我的用例中线程池的优势,因为这使得新任务需要创建新线程。
我想做的是:
ThreadPool pool(4);
for (...)
{
for (int i=0;i<something;i++)
pool.pushTask(...);
pool.join();
// do something with the results
}
谁能提出一个解决方案(除了使用 sourceforge 上现有的非官方线程池)? C++11 或 core boost 中有什么可以帮助我的吗?
乍一看,这看起来像是我想要做的,但是我发现我所见过的所有实现都无法加入当前活动的任务,这使得它对我的应用程序毫无用处。为了执行连接,它们向所有线程发送停止信号,然后连接它们。然而,这完全抵消了我的用例中线程池的优势,因为这使得新任务需要创建新线程。
我认为您可能误解了 asio 示例:
IIRC(已经有一段时间了)线程池中运行的每个线程都调用了io_service::run
这意味着实际上每个线程都有一个事件循环和一个调度程序。然后要让 asio 完成任务,您将任务发布到io_service
使用 io_service::post 方法和 asio 的调度机制来处理剩下的事情。只要你不打电话io_service::stop
,线程池将继续使用与您开始运行一样多的线程运行(假设每个线程都有工作要做或已分配了一个io_service::work
目的)。
So you don't需要为新任务创建新线程,这违背了线程池的概念。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)