Какой способ С++ 11 устранить асинхронную задачу и забыть об этом?
Мне нужно что-то вроде этого:
void launch_task()
{
std::thread([](){ run_async_task(); });
}
За исключением того, что деструктор потока завершит мою задачу. Мне не нужен какой-либо контроль над задачей, также не нужно возвращать значение. Он просто должен запустить свой курс, а затем поток должен завершиться, и объект потока С++ должен быть удален. Какой объект С++ 11 мне нужен?
Я просмотрел std::async
, но не смог найти пример использования для моего дела. Кажется, это довольно сложная система, и мне нужно как-то хранить и манипулировать std::future
, или она станет синхронной (если мое понимание верное, я не нашел хорошую четкую статью о std::async
).
Ответы
Ответ 1
Просто отделите его сразу после создания.
std::thread([](){ run_async_task(); }).detach();
После отсоединения поток больше не будет соединяться, поэтому ~thread()
не будет иметь эффекта.
Этот ответ обсуждает более подробные сведения об этом поведении.
Как упоминалось W.B. ниже, std::async
не будет работать по следующей причине, вытащил из этого reference.
Если std:: future, полученное из std:: async, имеет временный объект время жизни (не перемещается или привязано к переменной), деструктор std:: future будет блокироваться в конце полного выражения до тех пор, пока асинхронная операция завершена
Ответ 2
Воскрешение старого потока, но есть хитрый трюк *, как добиться функциональности "запустить и забыть", используя также std::async
, несмотря на блокирующий std::future
который он возвращает. Основным компонентом является разделяемый указатель на возвращаемый std::future
который фиксируется в lambda по значению, вызывая увеличение его счетчика ссылок. Таким образом, деструктор std::future
не будет вызываться до тех пор, пока лямбда не закончит свою работу, обеспечивая при желании реальное асинхронное поведение.
template <class F>
void call_async(F&& fun) {
auto futptr = std::make_shared<std::future<void>>();
*futptr = std::async(std::launch::async, [futptr, fun]() {
fun();
});
}
* Благодарность моему коллеге и настоящему эксперту C++, MVV, который показал мне этот трюк.