【发布时间】: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);
}
};
所以我被卡住了......似乎我可以永远等待或在每个线程中当前正在运行的作业之后切断队列。文档中一定有我遗漏的东西吗?
【问题讨论】:
-
io_service::run()将在所有工作完成后返回,这是您想要的行为。问题是为什么您对run()的调用会永远阻塞? -
好的。我还向 io_service 注册了 signal_set。当我删除信号集时,它会像使用
m_io_service.run()所宣传的那样工作。
标签: c++ boost boost-asio