对 boost::asio::io_context::run() 和 boost::thread::join() 感到困惑

Confused on boost::asio::io_context::run() and boost::thread::join()

正如 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

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

我想我一定是迷路了。

line with "Final count" 在打印机 class 的析构函数中执行,即在 main 到达 return();

时执行

运行 在所有计时器到期时终止(wait/do 没有更多工作)
一旦 运行 returns/unblocks "cout << between run and join" 被执行。