Biorąc pod uwagę następujący kod źródłowystd :: futures i wyjątek
#include <thread>
#include <future>
#include <iostream>
#include <string>
#include <chrono>
int main() {
auto task = std::async(std::launch::async, [] {
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
throw std::runtime_error("error");
});
try {
while (task.wait_for(std::chrono::seconds(0)) !=std::future_status::ready)
{
std::cout << "Not ready: " << std::endl;
}
task.get();
}
catch (const std::exception& e)
{
std::cout << "Valid: " << task.valid() << std::endl;
}
}
Spodziewam się, że program będzie odpowiedź z Valid: 0
. W tym przypadku używa się g ++ 6.2.0. Jednakże, używając MS VS2015 Wersja 14.0.25431.01 Update 3 odpowiedź jest Valid: 1
. Stan przyszłości nie jest nieważny, po tym, jak wyjątek został przeniesiony do głównego wątku. Czy jest to błąd, czy też mam tu do czynienia z niezdefiniowanym zachowaniem?
Czy istnieje obejście? Po usunięciu instrukcji wait_for działa ona zgodnie z oczekiwaniami, ale w moim kodzie produkcyjnym potrzebuję przepływu programu podobnego do źródła próbki. – IcePic
@IcePic może używać 'współbieżności :: task' zamiast. pod VC++, 'std :: async' jest tak czy inaczej cienkim opakowaniem zadań. –