按照boost文档here的说明,boost :: asio :: io_context :: run()函数将阻塞,直到所有工作都完成且不再需要分派处理程序为止,或者直到io_context被停止为止。
现在,我感到困惑的是,为什么直到所有处理程序完成工作后,我的代码才在另一个处理程序调度(t.join())之前没有执行。
我已经尝试了boost asio教程Timer.5 - Synchronising handlers in multithreaded programs
然后我在io.run()之后添加了一行代码:
int main()
{
boost::asio::io_context io;
printer p(io);
boost::thread t(boost::bind(&boost::asio::io_context::run, &io));
io.run();
std::cout << "between run and join" << std::endl;
t.join();
return 0;
}
这是控制台输出:
Timer 2: 0
Timer 1: 1
Timer 2: 2
Timer 1: 3
Timer 1: 4
Timer 2: 5
Timer 2: 6
Timer 1: 7
Timer 2: 8
Timer 1: 9
between run and join
Final count is 10
我想知道为什么在我的cout << ...代码之前执行了t.join()?我希望输出“运行和连接之间”位于所有Timer2的输出之前。
或者在boost :: thread t(boost :: bind(&boost :: asio :: io_context :: run,&io))中调度第二个处理程序;已经?但是如果是这样,为什么在运行run()返回之前启动t.join()?
我想我一定很迷茫。
答案 0 :(得分:1)
带有“最终计数”的行在打印机类的析构函数中执行,即在main到达return()时执行;
当所有计时器到期时运行终止(没有更多的工作可以等待/执行)
运行返回/取消阻止后,将执行“运行和连接之间的cout <<”。