c++ - 对 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;
代码之前执行?我希望输出“在运行和加入之间”在所有第二个线程的输出之前。
我想我一定是迷路了。
解决方案
带有“最终计数”的行在打印机类的析构函数中执行,即在 main 到达 return() 时执行;
当所有计时器到期时运行终止(没有更多的工作等待/做)
一旦运行返回/解除阻塞“cout <<在运行和加入之间”被执行。