Работали ли вы с асинхронными системами?

«Работали ли вы с асинхронными системами?» — вопрос из категории Архитектура, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, в C++ проектах я применял несколько подходов к асинхронности, в зависимости от стандарта и требований.

Основные инструменты:

  • C++11/14: std::async, std::future и std::promise для запуска задач в отдельных потоках и получения результатов.
  • C++20 и новее: Корутины (co_await, co_return) для написания асинхронного кода, который выглядит как последовательный. Использовал библиотеки вроде cppcoro или фреймворки (Boost.Asio с корутинами).
  • Сетевые/событийные фреймворки: Boost.Asio для асинхронного ввода-вывода на основе колбэков (completion handlers).

Пример с std::async (C++11):

#include <future>
#include <iostream>
#include <chrono>

int long_computation() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    return 42;
}

int main() {
    // Запускаем тяжелую операцию асинхронно
    std::future<int> result_future = std::async(std::launch::async, long_computation);

    // Основной поток может делать другую работу
    std::cout << "Main thread is working...n";

    // Блокируемся, пока результат не будет готов
    int result = result_future.get();
    std::cout << "Async result: " << result << 'n';
    return 0;
}

Почему это важно: Асинхронность позволяет избегать блокировок основного потока (например, UI или сетевого цикла), повышая отзывчивость и общую пропускную способность системы.