【问题标题】:Confused on boost::asio::io_context::run() and boost::thread::join()对 boost::asio::io_context::run() 和 boost::thread::join() 感到困惑
【发布时间】:2019-10-16 22:10:27
【问题描述】:

正如 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 &lt;&lt; "between run and join" &lt;&lt; std::endl; 代码之前执行?我希望输出“在运行和加入之间”在所有第二个线程的输出之前。

我想我一定是迷路了。

【问题讨论】:

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


    【解决方案1】:

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

    当所有计时器到期时运行终止(没有更多工作要等待/做)
    一旦运行返回/解除阻塞,就会执行“cout

    【讨论】:

    • 为什么在“cout
    • 线程 t 运行第二个 io.run() 在调用 t.join() 之前完成,因为 main 中的 io.run() 等待 io 完成。为什么你认为 join 是在 cout
    • 因为当我使用std::cout &lt;&lt; boost::this_thread::get_id() &lt;&lt; std::endl;35c Timer 2: 0 4a4c Timer 1: 1 4a4c Timer 2: 2 35c Timer 1: 3 35c Timer 2: 4 4a4c Timer 1: 5 4a4c Timer 2: 6 35c Timer 1: 7 35c Timer 2: 8 4a4c Timer 1: 9 4a4c 35c btween run and join 打印 print1() 和 print2() 中的线程 ID 时,我看到控制台中的 2 个线程的输出在“运行和加入之间”之前。跨度>
    • 正如我想象的那样,第一个线程是由io.run();发起的。然后io.run() 屏蔽并完成了它的所有工作。后来,std::cout &lt;&lt; "between run and join" &lt;&lt; std::endl; 被执行,最后,第二个线程被 t.join() 启动完成它的工作(什么都没有)。
    • @UFO 线程在您调用boost::thread t(boost::bind(&amp;boost::asio::io_context::run, &amp;io)); 时启动并运行。代码t.join() 只是等到线程完成(如果尚未完成),并且在主返回的 io.run() 之后发生。由于这个原因,线程已经完成,join 立即返回,无需等待。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-21
    • 2021-11-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多