首页 文章

带boost :: asio的ThreadPool不会退出?

提问于
浏览
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,但没有任何“工作” . 没有工作的io_services退出了自己,如boost :: asio docs中所述 . 现在,为什么我的程序永远不会退出?

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() ,然后在处理程序中你可以重置你的工作对象,看看这一切应该如何协同工作 .

    请参阅文档的this部分 .

相关问题