Opened 4 years ago

#13567 new Bugs

io_context ::run() doesn't return immediately on stopped io_context due to Windows implementation

Reported by: cvzakharchenko@… Owned by: chris_kohlhoff
Milestone: To Be Determined Component: asio
Version: Boost 1.67.0 Severity: Problem
Keywords: windows, io_context, stop, stopped Cc:

Description

This code hangs, when running on Windows:

    boost::asio::io_context context;                // 1
    boost::asio::post(context, []() { for (;;); }); // 2
    context.stop();                                 // 3
    context.run();                                  // hangs in a handler, posted in 2

io_context::stop documentation says:

Subsequent calls to run(), run_one(), poll() or poll_one() will return immediately until restart() is called.

Which is, judging by example above, isn't true. Same goes for io_context::stopped:

When an io_context object is stopped, calls to run(), run_one(), poll() or poll_one() will return immediately without invoking any handlers.

and code example below:

    boost::asio::io_context context;                // 1
    boost::asio::post(context, []() { for (;;); }); // 2
    context.stop();                                 // 3
    if (context.stopped())
    {
        context.run();                              // hangs in a handler, posted in 2
    }

When running on Linux, same code fully complies the documentation and doesn't invoke any handlers in examples provided.

Change History (0)

Note: See TracTickets for help on using tickets.