cpp_ready | Unsorted

Telegram-канал cpp_ready - C/C++ Ready | Программирование

-

Авторский канал по разработке на C и C++. Ресурсы, обучения, задачи, шпаргалки. Ежедневно информация пополняется! Автор: @energy_it

Subscribe to a channel

C/C++ Ready | Программирование

Почему 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. Иначе “запустил в фоне” легко превращается в “случайно дождался здесь же”.

📣 C++ Ready | #совет

Читать полностью…
Subscribe to a channel