При успешном запуске обеих задач вывод будет 111222. Временный future первого std::async уничтожается в конце выражения и ждёт завершения своей async-задачи до следующего вызова.
Что выведет программа, использующая два std::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.