Boost.Asio функционирует под капотом - PullRequest
0 голосов
/ 10 октября 2019

Мне просто интересно, как работает 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 удается одновременно выполнить две операции блокировки?

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Разные платформы имеют разные механизмы ожидания для нескольких файловых дескрипторов / дескрипторов.

Windows использует перекрывающиеся порты завершения ввода-вывода и ввода-вывода. Linux использует epoll, BSD использует Kqueues, а некоторые платформы используют select. ASIO абстрагируется от этих механизмов и предоставляет согласованный кроссплатформенный API.

Получите представление о том, как работает ASIO, выберите один из вышеперечисленных и попробуйте создать свою собственную реализацию.

0 голосов
/ 11 октября 2019

См. CppCon 2016: Майкл Кейсс "Асинхронный ввод-вывод с Boost.Asio" для превосходного описания того, как asio работает.

...