Что выведет программа, использующая два std::async

При успешном запуске обеих задач вывод будет 111222. Временный future первого std::async уничтожается в конце выражения и ждёт завершения своей async-задачи до следующего вызова.

Короткий ответ

Что ответить на собеседовании

При успешном запуске обеих задач вывод будет 111222. Временный future первого std::async уничтожается в конце выражения и ждёт завершения своей async-задачи до следующего вызова.

Подробный разбор

Ответ с пояснениями

Условие

Нужно определить, какой текст появится в консоли после запуска следующего кода.

#include <future>
#include <iostream>
#include <thread>

constexpr int total = 3;

int main(int argc, char* argv[]) {
    std::async(std::launch::async, []() {
        for (int i = 0; i < total; ++i) {
            std::cout << 1;
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
    });

    std::async(std::launch::async, []() {
        for (int i = 0; i < total; ++i) {
            std::cout << 2;
            std::this_thread::sleep_for(std::chrono::milliseconds(1));
        }
    });

    return 0;
}

Ответ

При успешном запуске обеих задач вывод будет 111222. Временный future первого std::async уничтожается в конце выражения и ждёт завершения своей async-задачи до следующего вызова.

Из-за явно указанного std::launch::async результат связан с отдельной асинхронной задачей. Уничтожение последнего связанного future здесь не позволяет первой задаче остаться незавершённой при переходе к следующей строке.

Чтобы задачи действительно могли работать одновременно, сохраните оба future в переменные, а затем вызовите get для каждого. Тогда порядок символов уже не фиксирован, а исключения из задач можно получить через get. Перевода строки исходный код не печатает.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее