0

タスク > 0 の場合に processJob() 関数を通知するジョブキューについて、誰かが良い設計案を持っているかどうか疑問に思っていました。私は Boost と C++ を使用しており、そのような設計の一般的なアイデアを得ようとしています。ありがとう。

4

2 に答える 2

0

すでにブースト ライブラリを使用している場合は、boost::asio をそのまま使用すると便利です。io_service オブジェクトを使用してジョブのキューを管理できます。これは、ポストされた順序でコールバックが呼び出されることを保証するためです。1 つのスレッドでのみ 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;
}
于 2013-01-16T01:57:17.717 に答える
0

processJob()「条件変数」を使用して実行中かどうかを制御する別のスレッドで実行します。キューに何かを追加するとき、そのcvを通知します

ループ ロジックは次のようなものです。

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ます。そのシグナルの設定もnotify()cvで呼び出す必要があります

于 2013-01-15T17:45:58.720 に答える