Что происходит с асинхронной функцией-членом после того, как локальный объект выходит из области видимости?

#c

#c

Вопрос:

Например, если я могу вызвать асинхронную функцию следующим образом:

 {
    Example example;
    example.asyncFuncInside();
}
 

Поскольку объект освобождается после области видимости, будут ли у него какие-либо риски для текущей задачи, выполняемой внутри асинхронной функции?

Комментарии:

1. зависит от того, что asyncFuncInside(); есть и должна ли быть активна его асинхронная часть example

2. Да. Определенно плохо. Он все еще вызывает его. Неопределенное поведение, потому что вы больше не знаете, что будет в этом месте.

Ответ №1:

На это нельзя ответить в текущей форме. Если «асинхронный» является отключенным std::thread , ничего плохого не происходит. С другой стороны, если асинхронная функция была реализована с использованием std::async , то asyncFuncInside она вернет ее std::future , и, поскольку это игнорируется, dtor std::future будет блокировать.

Комментарии:

1. Извините, но почему для отдельного std::thread ничего плохого не происходит? Я полагаю, что доступ ко всем переменным-членам будет рискованным после уничтожения локального объекта?

2. @Michael: Доступ к элементам уничтоженного объекта действительно плох, но это плохая идея, независимо от того, как это происходит. Итак, сначала мы предполагаем, что код, не связанный с потоком, правильный, а затем мы рассматриваем, std::thread::detach нарушает ли что-нибудь.