Я использую комбинацию std::async
и std::future
от C++ 11
. Я использую для принудительного выполнения time_out для определенного действия, которое я делаю в своем коде, который может использовать время, когда я пытаюсь подключиться к серверу.std :: future возвращается из std :: async зависает при выходе из сферы действия
Ниже, как код:
#include <future>
#include <chrono>
std::size_t PotentiallyLongRunningActivity() {
using namespace std::chrono_literals;
std::this_thread::sleep_for(10000s);
return 10;
}
bool DoActivity() {
bool activity_done = false;
auto my_future_result(std::async(std::launch::async, []() {
return PotentiallyLongRunningActivity(); //returns size_t
}));
std::future_status my_future_status = my_future_result.wait_for(std::chrono::milliseconds(800));
if (my_future_status == std::future_status::timeout) {
activity_done = false;
}
else if (my_future_status == std::future_status::ready) {
if (my_future_result.valid() && my_future_result.get() > 0) {
activity_done = true;
}
}
return activity_done;
//my_future_result hangs while exiting this method !!!
}
int main(int argc, char *argv[])
{
DoActivity();
return 0;
}
вещь прекрасно работает в большинстве случаев. Ожидается, что будущие тайм-ауты & готовятся во многих случаях. Но, странное поведение, которое я наблюдаю, заключается в том, что в некоторых случаях пользовательский интерфейс зависает, потому что my_future_result
при выходе из области зависает. Я подтвердил это, повторив вызов my_future_result.get()
, который никогда не возвращается, если вызван непосредственно перед выходом из метода.
Как я могу обойти это? Есть ли способ отменить или удалить или прекратить действие std::future
?
Это говорит о том, что я рекомендую вам создать [MVCE] (http://stackoverflow.com/help/mcve). – tambre
Есть ли вероятность, что ваше будущее недействительно до вызова ожидания? –
Асинхронные задачи блокируются до завершения задачи после уничтожения. Это похоже на выполнение 'wait' при выходе из области видимости. –