对 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" 被执行。
正如 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" 被执行。