Мне просто интересно, как работает Boost.Asio, например async_read_until
, под капотом. Рассмотрим пример кода:
#include <boost/asio.hpp>
#include <boost/process.hpp>
#include <iostream>
#include <thread>
namespace ba = boost::asio;
namespace bp = boost::process;
using namespace std::chrono_literals;
int main()
{
ba::io_context context(1);
ba::steady_timer timer(context);
bp::async_pipe pipe(context);
ba::streambuf buffer;
std::thread thread([&]()
{
std::this_thread::sleep_for(3s);
pipe.write_some(ba::buffer("END"));
});
thread.detach();
ba::async_read_until(pipe, buffer, "END", [&](const auto& code, std::size_t size)
{
if (!code)
{
timer.cancel();
std::cout << "Reading finished!" << std::endl;
}
});
timer.expires_from_now(10s);
timer.async_wait([&](const auto& code)
{
if (!code)
{
context.stop();
std::cout << "Timer expired!" << std::endl;
}
});
context.run();
return 0;
}
Я попытался поэкспериментировать с этим примером кода и продолжительностью инвертирования для sleep_for
и async_wait
, и этот код работал как ожидалось. Но как это возможно? io_context
использует только один поток. Не стоит ли читать и ждать в очереди? Как при таких обстоятельствах io_context
удается одновременно выполнить две операции блокировки?