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

Обходной путь для блокировки async?

Вызов async ниже блокируется, поскольку деструктор возвращаемого будущего блокируется:

void foo() {}

void foo_async() {
    std::async(std::launch::async, foo);
}

Но я не хочу блокировать!

Я планирую использовать следующее обходное решение:

void foo_async() {
    std::thread(foo).detach();
}

Это нормально? Или вы порекомендовали бы другое решение?

4b9b3361

Ответ 1

Вы можете использовать следующую версию async, которая обеспечивает неблокирующее будущее. Таким образом, вы можете воспользоваться будущим, если вам это нужно, а с другой стороны вы можете просто игнорировать его, когда хотите выполнить задачу "огонь и забвение".

template< class Function, class... Args>
std::future<typename std::result_of<Function(Args...)>::type> async( Function&& f, Args&&... args ) 
{
    typedef typename std::result_of<Function(Args...)>::type R;
    auto bound_task = std::bind(std::forward<Function>(f), std::forward<Args>(args)...);
    std::packaged_task<R()> task(std::move(bound_task));
    auto ret = task.get_future();
    std::thread t(std::move(task));
    t.detach();
    return ret;   
}

Ответ 2

Если вы действительно хотите перезапустить и забыть вызов foo(), я бы сказал, что ваше обходное решение в порядке.

В противном случае просто auto f = std::async(std::launch::async, foo); и, возможно, вернем будущее из foo_async().