Что такое иллюзия многопоточности?

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

Ответ

Иллюзия многопоточности — это модель, при которой однопоточное приложение создаёт видимость параллельного выполнения нескольких задач. Это достигается за счёт кооперативной многозадачности: задача добровольно отдаёт управление (например, после обработки порции работы), позволяя планировщику переключиться на другую задачу в том же потоке.

Классический пример в C++ — цикл обработки событий (event loop):

// Упрощенная модель, используемая в UI-фреймворках (например, Qt) или сетевых циклах.
void eventLoop() {
    while (isRunning) {
        // 1. Обработать все накопившиеся события UI (клики, нажатия клавиш).
        processPendingUIEvents();
        // 2. Выполнить кусок длительной фоновой задачи (рендеринг, вычисления).
        if (!backgroundTask.isFinished()) {
            backgroundTask.doChunkOfWork();
        }
        // 3. Небольшая пауза или ожидание новых событий.
        std::this_thread::sleep_for(std::chrono::milliseconds(10));
        // Пользователь видит "одновременную" отзывчивость UI и прогресс фоновой задачи.
    }
}

Ключевые ограничения и современные альтернативы:

  • Нет реального параллелизма: Долгая операция в doChunkOfWork() заблокирует весь цикл, и интерфейс «зависнет».
  • Современный подход — асинхронность: Использование асинхронных операций ввода-вывода с коллбеками (например, Boost.Asio) или сопрограмм (std::async, std::future, корутины C++20). Это позволяет потоку не блокироваться на ожидании I/O, продолжая обрабатывать другие задачи.
  • Истинная многопоточность: Для реального использования нескольких ядер CPU необходимо создавать потоки (std::thread) или использовать пулы потоков.