-
Авторский канал по разработке на C и C++. Ресурсы, обучения, задачи, шпаргалки. Ежедневно информация пополняется! Автор: @energy_it
Почему std::async иногда не делает код асинхронным?
На первый взгляд кажется, что задача просто запускается в фоне, а выполнение сразу идет дальше. Но у std::async есть важная деталь: он возвращает std::future.
Если этот future не сохранить, он будет уничтожен в конце выражения. А для задачи, запущенной с std::launch::async, это может означать ожидание завершения прямо в деструкторе.
В итоге код выглядит как fire-and-forget, но на деле поток может заблокироваться уже на этой строке. То есть вместо фоновой работы ты случайно получаешь скрытую синхронизацию.
Из-за этого баг особенно неприятный: внешне все выглядит асинхронно, а по факту приложение тормозит в месте, где ты вообще не ждешь блокировки.
Если результат нужен позже, future надо сохранить и явно решить, когда именно его ждать.
auto fut = std::async(std::launch::async, [] {
reindex();
});
std::cout << "after async\n";future от std::async. Иначе “запустил в фоне” легко превращается в “случайно дождался здесь же”.