在jobqueue中回调到达任务?

时间:2013-01-15 17:23:03

标签: c++ boost threadpool

我想知道是否有人对任务有任何好的设计建议,当任务>时通知processJob()函数。我正在使用Boost和c ++,只是想了解一下这样的设计。感谢。

2 个答案:

答案 0 :(得分:0)

我会在一个单独的线程中运行processJob(),该线程使用“条件变量”来控制它是否正在运行;当向队列添加内容时,通知c.v.

循环逻辑类似于:

boost::unique_lock<boost::mutex> lock(mymutex);
while (!terminate)
{
    lock.lock();
    while (!Q.empty())
        jobCV.wait(lock);
    pItem = Q.pop();
    lock.unlock();
    pItem->process();
}

请记住,向队列中添加项目也需要锁定相同的互斥锁。此外,您需要在wait()之前为将设置terminate的信号进行测试;并且该信号的设置还需要在c.v。

上调用notify()

答案 1 :(得分:0)

如果您已经使用了boost库,那么只需使用boost :: asio即可。 io_service对象可用于管理作业队列,因为它保证将按照发布的顺序调用回调。如果你只在一个线程中运行io_service,那就没有麻烦了。一些示例代码:

#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/thread.hpp>
#include <boost/shared_ptr.hpp>
#include <iostream>
#include <cstdlib>

int job_number = 0;

struct Job
{
    virtual void run() { std::cout << "job " << ++job_number << " done" << '\n'; }
    virtual ~Job() {}
};

class Processor
{
private:
    boost::asio::io_service ioserv_;
    boost::asio::io_service::work work_;
    boost::thread thread_;

public:
    Processor() : ioserv_(), work_(ioserv_) {
    }

    void run() {   
        ioserv_.reset();
        thread_ = boost::thread (boost::bind(&boost::asio::io_service::run, &ioserv_));
    }

    void stop() { 
        ioserv_.stop();
    }

    ~Processor() {
        stop();
        if (thread_.get_id() != boost::thread::id())
            thread_.join();
    }

    void processJob(boost::shared_ptr<Job> j)
    {
        j->run();
    }

    void addJob(boost::shared_ptr<Job> j)
    {
        ioserv_.post(boost::bind(&Processor::processJob, this, j));
    }

};

int main()
{
    Processor psr;
    psr.run();

    for (int i=0; i<10; ++i)
        psr.addJob(boost::shared_ptr<Job>(new Job));

    sleep(1);

    return 0;
}