我发现threadpool似乎还没有提升,但我现在可以使用它(除非有更好的解决方案).
我有几百万个小任务,我想同时执行,我想使用线程池来安排任务的执行.线程池的documentation提供(大致)这个例子:
#include "threadpool.hpp"
using namespace boost::threadpool;
// A short task
void task()
{
// do some work
}
void execute_with_threadpool(int poolSize, int numTasks)
{
// Create a thread pool.
pool tp(poolSize);
for(int i = 0; i++; i < numTasks)
{
// Add some tasks to the pool.
tp.schedule(&task);
}
// Leave this function and wait until all tasks are finished.
}
但是,该示例仅允许我安排非成员函数(或任务).有没有办法可以安排成员函数执行?
更新:
好吧,据说是library allows you to schedule a Runnable
for execution,但我无法弄清楚我应该继承的Runnable类在哪里.
template<typename Pool, typename Runnable>
bool schedule(Pool& pool, shared_ptr<Runnable> const & obj);
UPDATE2:
我想我发现了我需要做的事情:我必须创建一个runnable,它将获取任何必要的参数(包括对具有将被调用的函数的对象的引用),然后我使用静态调度函数在给定的线程池上安排runnable:
class Runnable
{
private:
MyClass* _target;
Data* _data;
public:
Runnable(MyClass* target, Data* data)
{
_target = target;
_data = data;
}
~Runnable(){}
void run()
{
_target->doWork(_data);
}
};
以下是我在MyClass中安排它的方式:
void MyClass::doWork(Data* data)
{
// do the work
}
void MyClass::produce()
{
boost::threadpool::schedule(myThreadPool, boost::shared_ptr<Runnable>(new Runnable(myTarget, new Data())));
}
但是,adaptor from the library中有一个错误:
template<typename Pool, typename Runnable>
bool schedule(Pool& pool, shared_ptr<Runnable> const & obj)
{
return pool->schedule(bind(&Runnable::run, obj));
}
请注意,它需要一个Pool的引用,但它试图将其称为它是一个指向池的指针,所以我也必须修复它(只需将 – >更改为a.).
解决方法:
要安排任何功能或成员功能 – 使用Boost.Bind或Boost.Lambda(按此顺序).您也可以根据自己的情况考虑使用特殊库.如果您使用VC2010 – Microsoft Parallel Patterns Library,我可以推荐Inter Threading Building Blocks.
编辑:
我从来没有使用过这个库,也没有听过任何关于它的坏消息,但它已经足够老了,仍然没有被包含在Boost中.我会检查一下原因.
编辑2:
另一个选项 – Boost.Asio.它主要是一个网络库,但它有一个你可以使用的调度程序.我会使用this multithreading approach.而不是使用异步网络操作来调度你的任务通过boost :: asio :: io_service :: post().