c – 如何在boost :: threadpoool中安排成员函数的执行

我发现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.BindBoost.Lambda(按此顺序).您也可以根据自己的情况考虑使用特殊库.如果您使用VC2010 – Microsoft Parallel Patterns Library,我可以推荐Inter Threading Building Blocks.

编辑:

我从来没有使用过这个库,也没有听过任何关于它的坏消息,但它已经足够老了,仍然没有被包含在Boost中.我会检查一下原因.

编辑2:

另一个选项 – Boost.Asio.它主要是一个网络库,但它有一个你可以使用的调度程序.我会使用this multithreading approach.而不是使用异步网络操作来调度你的任务通过boost :: asio :: io_service :: post().

上一篇:使用Python pool.map让多个进程对列表执行操作


下一篇:c# – ThreadPool在调试模式和运行时的行为不同