Как запустить 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 шт):

Автор решения: Harry

Для такого случая лучшее решение thread с вызовом detach. Для этого async, пожалуй, несколько тяжеловесен — вас же не интересует ни возвращаемое значение, ни перехват могущих быть исключений...

Но можно и с async игнорировать возврат, если просто использовать не фьючерс, а указатель на него.

future<void> * f = new future<void>(std::async(std::launch::async, foo));

И все. Можете забыть про него до окончания программы :), можете через какое-то время вызвать delete...

Такой вариант годится?

→ Ссылка