C++ Academy · Урок

Использование Boost Asio для современного асинхронного IO

Используйте Boost.Asio для переносимого современного асинхронного I/O.

Урок 4 из 414 шагов

«Использование Boost Asio для современного асинхронного IO» — бесплатный урок C++ Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C++ Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C++ Academy содержит 4 уроков всего.

Boost.Asio

Boost.Asio — фактический стандарт библиотеки асинхронного ввода-вывода для C++. Она кроссплатформенная, почти полностью состоит из заголовочных файлов и используется в промышленной разработке бесчисленным количеством сервисов.

Объект io_context

В основе Asio лежит boost::asio::io_context — цикл обработки событий. Все асинхронные операции выполняются в нём.

#include <boost/asio.hpp>
namespace asio = boost::asio;

asio::io_context io;
// register async operations...
io.run();

Объекты acceptor и socket

ip::tcp::acceptor ожидает входящие соединения, а ip::tcp::socket обрабатывает отдельные соединения.

asio::ip::tcp::acceptor acceptor(io,
    {asio::ip::tcp::v4(), 8080});
asio::ip::tcp::socket socket(io);
acceptor.async_accept(socket, [&](auto err) {
    if (!err) handle(std::move(socket));
});

Стиль с обратными вызовами

Асинхронные операции принимают обработчик завершения — обычно лямбда-выражение. Обработчик выполняется в потоке io_context после завершения операции.

asio::async_read(socket, asio::buffer(buf),
    [](auto err, size_t n) {
        if (!err) std::cout << "read " << n << " bytes";
    });

Стиль с сопрограммами (C++20)

Современный Asio поддерживает сопрограммы C++20: код выглядит как синхронный, но выполняется асинхронно.

asio::awaitable<void> handle(asio::ip::tcp::socket sock) {
    char buf[1024];
    auto n = co_await sock.async_read_some(asio::buffer(buf), asio::use_awaitable);
    co_await asio::async_write(sock, asio::buffer(buf, n), asio::use_awaitable);
}

Strand для безопасности потоков

Запускайте несколько потоков io_context, но используйте strand, чтобы последовательно выполнять обработчики, обращающиеся к одним и тем же данным. Это обеспечивает безопасность без блокировок.

Таймеры

Asio включает таймеры, встроенные в io_context. Запланируйте выполнение задачи после задержки.

asio::steady_timer timer(io, std::chrono::seconds(5));
timer.async_wait([](auto err) {
    std::cout << "5 seconds passed";
});

Буферы

asio::buffer оборачивает память для ввода-вывода и работает с векторами, массивами и строками.

std::vector<char> data(1024);
async_read(sock, asio::buffer(data), handler);

Обработка ошибок

Асинхронные обработчики получают error_code. Используйте его вместо исключений для ожидаемых сбоев (отключение, время ожидания).

Автономный Asio

Asio доступен как автономная библиотека без зависимости от Boost — это удобно для проектов, которые хотят избежать использования Boost.

Производительность

Asio — одна из самых быстрых асинхронных библиотек для C++. Она масштабируется до множества одновременных соединений в одном потоке и поддерживает многопоточные объекты io_context.

Когда использовать

Используйте Asio для:

  • высокопроизводительных сетевых серверов
  • кроссплатформенного асинхронного ввода-вывода
  • асинхронного кода на основе сопрограмм
  • любых задач, требующих десятков тысяч соединений

Быстрая проверка

Какой центральный объект Boost.Asio управляет обработкой событий?

Итоги

Boost.Asio предоставляет кроссплатформенный асинхронный ввод-вывод. Объект io_context управляет циклом обработки событий. Используйте обратные вызовы в традиционном стиле или сопрограммы для асинхронного кода, выглядящего как синхронный. Автономный Asio работает без Boost.

Можно начать бесплатно

Изучай C++ с ИИ-репетитором — бесплатно

Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.

Курсы
51
Уроки
203

Часто задаваемые вопросы

Урок «Использование Boost Asio для современного асинхронного IO» бесплатный?

Да — полный текст урока «Использование Boost Asio для современного асинхронного IO» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C++ Academy, подпишись на CoddyKit PRO. Курс C++ Academy содержит 4 уроков всего.

Чему я научусь в уроке «Использование Boost Asio для современного асинхронного IO»?

Используйте Boost.Asio для переносимого современного асинхронного I/O. Ты практикуешь C++ Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать C++ Academy?

Предыдущий опыт не требуется. C++ Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Использование Boost Asio для современного асинхронного IO»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке C++ Academy?

Да. Каждый урок C++ Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. API сокетов BSD в C++
  2. Создание эхо-сервера TCP
  3. Асинхронный IO с epoll и kqueue
  4. Использование Boost Asio для современного асинхронного IO
← Назад к C++ Academy