Как запустить std::async без блокировки фьючерса? С++
В стандартной библиотеке есть такая замечательная штука, как std::async, которая позволяет толкнуть функцию планировщику задач. Проблема следующая: есть функция, которую просто нужно запустить параллельно. Меня не интересует возвращаемое значение, меня не интересует синхронизация, поскольку эта функция не имеет сайд эффектов. Она просто выводит текст через некоторый таймаут:
void foo()
{
std::this_thread::sleep_for(10s);
}
Однако при попытке запустить такую функцию через std::async мы столкнёмся с блокировкой:
auto f = std::async(std::launch::async, foo);
Поскольку деструктор фьючерса будет выполнен ДО окончания выполнения задачи. Таким образом задача не будет выполнена параллельно - основной поток будет ждать завершения std::async.
Как этого избежать?
Ответы (1 шт):
Для такого случая лучшее решение thread с вызовом detach. Для этого async, пожалуй, несколько тяжеловесен — вас же не интересует ни возвращаемое значение, ни перехват могущих быть исключений...
Но можно и с async игнорировать возврат, если просто использовать не фьючерс, а указатель на него.
future<void> * f = new future<void>(std::async(std::launch::async, foo));
И все. Можете забыть про него до окончания программы :), можете через какое-то время вызвать delete...
Такой вариант годится?