【问题标题】:Boost Asio: waiting until thread_group has processed all posted tasks?Boost Asio:等到 thread_group 处理完所有发布的任务?
【发布时间】:2012-02-23 05:34:34
【问题描述】:

我有一个对象,它一旦创建就会在后台执行许多任务,但应该阻塞直到 /all/ 发布的任务完成。即:

struct run_many{
    boost::asio::io_service       m_io_service;
    boost::thread_group           m_threads;
    boost::asio::signal_set       m_signals;

    void evaluate(std::string work, int i){ /*...*/ }

    void run_tasks(int tasks, std::string work){
        {
          boost::asio::io_service::work w(m_io_service); //
          for(int i=0;i<tasks;i++)
               m_io_service.post(boost::bind(&run_many::evaluate, this, work, i));
        }

        //m_io_service.run();  // blocks forever
        m_io_service.stop();   // seems to cut off queued jobs
        m_threads.join_all();  // works only after m_io_service.stop()
    }

    run_many(int n_workers)
    {
        m_threads.create_thread(boost::bind(&boost::asio::io_service::run,m_io_service);
    }
};

所以我被卡住了......似乎我可以永远等待或在每个线程中当前正在运行的作业之后切断队列。文档中一定有我遗漏的东西吗?

【问题讨论】:

标签: c++ boost boost-asio


【解决方案1】:

根据文档,这个想法应该可行(伪代码):

...

// put a few handlers into io_service

...

// don't forget to destroy all boost::asio::io_service::work objects
while (m_io_service.stopped())
{
m_io_service.run();
}

// when code reaches this line m_io_service will be in stopped state and all handlers will be executed

// this code can be called without any doubts about being locked

m_threads.join_all();

【讨论】:

    猜你喜欢
    • 2014-04-21
    • 2021-08-05
    • 2020-08-03
    • 2020-05-22
    • 2020-06-17
    • 1970-01-01
    • 2013-09-22
    • 2020-03-19
    相关资源
    最近更新 更多