Подтвердить что ты не робот

Какой способ С++ 11 устранить асинхронную задачу и забыть об этом?

Мне нужно что-то вроде этого:

void launch_task()
{
    std::thread([](){ run_async_task(); });
}

За исключением того, что деструктор потока завершит мою задачу. Мне не нужен какой-либо контроль над задачей, также не нужно возвращать значение. Он просто должен запустить свой курс, а затем поток должен завершиться, и объект потока С++ должен быть удален. Какой объект С++ 11 мне нужен?

Я просмотрел std::async, но не смог найти пример использования для моего дела. Кажется, это довольно сложная система, и мне нужно как-то хранить и манипулировать std::future, или она станет синхронной (если мое понимание верное, я не нашел хорошую четкую статью о std::async).

4b9b3361

Ответ 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, который показал мне этот трюк.