首页 > 解决方案 > 对 boost::asio::io_context::run() 和 boost::thread::join() 感到困惑

问题描述

正如此处的 boost 文档所述, boost::asio::io_context::run() 函数会阻塞,直到所有工作完成并且没有更多的处理程序要分派,或者直到 io_context 已停止。

现在我很困惑为什么我的代码位于另一个处理程序调度(t.join())之前直到所有处理程序完成它们的工作才执行。

我已经尝试过 boost asio 教程Timer.5 - 在多线程程序中同步处理程序

我在 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

我想知道为什么 t.join() 在我的std::cout << "between run and join" << std::endl;代码之前执行?我希望输出“在运行和加入之间”在所有第二个线程的输出之前。

我想我一定是迷路了。

标签: c++multithreadingboost-asioboost-thread

解决方案


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

当所有计时器到期时运行终止(没有更多的工作等待/做)
一旦运行返回/解除阻塞“cout <<在运行和加入之间”被执行。


推荐阅读