0

boost::asio で作成されたスレッド プールの最小限の例を次に示します。

#include <queue>
#include <map>

#include <boost/shared_ptr.hpp>
#include <boost/asio/io_service.hpp>
#include <boost/thread/thread.hpp>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp> // remove me (only for io)

class ThreadPool
{
public:
    void work_as_mainthread(void) { m_io_service.run(); }

    ThreadPool(int poolSize = 4) : timer(m_io_service)
    {
        timer.expires_from_now(boost::posix_time::seconds(1)); // this line does not affect the problem
        m_pWork.reset( new boost::asio::io_service::work(m_io_service) );

        for ( int i = 0; i < poolSize; ++i)
            m_threadGroup.create_thread( boost::bind(&boost::asio::io_service::run, &m_io_service) );
    }

    ~ThreadPool()
    {
        m_pWork.reset();
        m_threadGroup.join_all();
    }

private:
    boost::asio::io_service m_io_service;
    boost::asio::deadline_timer timer;
    boost::shared_ptr<boost::asio::io_service::work> m_pWork;
    boost::thread_group m_threadGroup;
};

int main()
{
    int n_threads = 2;
    ThreadPool pool(n_threads);
    pool.work_as_mainthread();
    // this line is never reached...
    return 0;
}

必要に応じて、次のようにコンパイルできます。

g++ -Wall -g -lboost_thread -lboost_date_time -lboost_system main.cpp -o main

私が不思議に思うのは、プログラムが止まらないことです。私がしているのは、io_service::run を呼び出すことですが、そのための「作業」はありません。boost::asio docs で述べられているように、仕事のない io_services は自分自身を終了しました。では、なぜ私のプログラムは決して終了しないのでしょうか?

4

1 に答える 1

3

boost::asio::io_service::workオブジェクトを作成すると、io_serviceが完了しなくなります。

// This line keeps the io_service running
m_pWork.reset( new boost::asio::io_service::work(m_io_service) );

停止したい場合は、次のようにその作業オブジェクトを破棄する必要があります。

// stop the worker(s)
m_pWork.reset();

これを行う適切な時間/場所を見つけるのはあなた次第です。を呼び出すことをお勧めしtimer.async_wait()ます。その後、ハンドラーで作業オブジェクトをリセットして、これらすべてがどのように連携するかを確認できます。

ドキュメントのこの部分を参照してください。

于 2012-08-23T15:39:02.630 に答える