我的应用程序需要一个线程池,并且我希望尽可能依赖于标准的(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中有什么可以帮助我的吗?
发布于 2012-10-25 02:49:15
乍一看,这看起来像是我想要做的,但是我发现我看到的所有实现都没有办法加入到当前活动的任务中,这使得它对我的应用程序没有用处。为了执行连接,它们向所有线程发送停止信号,然后连接它们。然而,在我的用例中,这完全抵消了线程池的优势,因为这使得新任务需要创建新线程。
我认为您可能误解了asio示例:
在线程池中运行的每个线程都调用了io_service::run,这意味着每个线程实际上都有一个事件循环和一个调度器。然后,为了让asio完成任务,您可以使用io_service::post方法将任务发布到io_service,asio的调度机制负责其余的工作。只要您不调用io_service::stop,线程池将使用与您开始运行时一样多的线程继续运行(假设每个线程都有工作要做,或者已经分配了一个io_service::work对象)。
因此,您不需要为新任务创建新线程,这与线程池的概念背道而驰。
发布于 2012-10-14 18:31:58
让每个任务类派生自具有“OnCompletion( task )”方法/事件的任务。然后,线程池线程可以在调用任务的main run()方法之后调用它。
然后,等待单个任务完成是很容易的。OnCompletion()可以执行所需的任何操作来通知发起线程、通知condvar、将任务排队到生产者-消费者队列、调用SendMessage/PostMessage API、Invoke/BeginInvoke等等。
如果一个调度线程需要等待多个任务都完成,你可以扩展上面的方法,并向池发出一个“等待任务”。等待任务有自己的OnCompletion来通知其他任务的完成,并有一个线程安全的“任务计数器”(原子操作或锁),设置为要发出的“主”任务的数量。等待任务首先被发送到池中,运行它的线程在等待任务中等待私有的“allDone”condvar。然后,'main‘任务被发送到池,它们的OnCompletion被设置为调用等待任务的一个方法,该方法将任务计数器递减到零。当任务计数器达到零时,完成该任务的线程会向allDone condvar发出信号。然后,等待任务OnCompletion运行,并发出所有主要任务完成的信号。
这种机制不需要不断地创建/终止/加入/删除线程池线程,对原始任务需要如何发送信号没有任何限制,并且您可以根据需要发出任意多个这样的任务组。但是,您应该注意到,每个等待任务都会阻塞一个线程池线程,因此请确保在池中创建一些额外的线程(通常不会有任何问题)。
发布于 2012-10-25 01:22:15
这似乎是boost::futures的工作。文档中的示例似乎确切地演示了您要做的事情。
https://stackoverflow.com/questions/12880954
复制相似问题