对boost :: asio :: io_context :: run()和boost :: thread :: join()

时间:2019-05-31 09:11:06

标签: c++ multithreading boost-asio boost-thread

按照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()?

我想我一定很迷茫。

1 个答案:

答案 0 :(得分:1)

带有“最终计数”的行在打印机类的析构函数中执行,即在main到达return()时执行;

当所有计时器到期时运行终止(没有更多的工作可以等待/执行)
运行返回/取消阻止后,将执行“运行和连接之间的cout <<”。