den folgenden Quellcodestd :: Futures und Ausnahme
#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;
}
}
Da ich würde erwarten, dass das Programm wird Antwort mit Valid: 0
. Mit g ++ 6.2.0 ist dies der Fall. Bei Verwendung von MS VS2015 Version 14.0.25431.01 Update 3 lautet die Antwort jedoch Valid: 1
. Der Status der Zukunft wird nicht ungültig, nachdem die Ausnahme an den Hauptthread weitergegeben wurde. Ist das ein Fehler oder laufe ich hier auf undefiniertes Verhalten?
Gibt es einen Workaround? Wenn ich die wait_for-Anweisung lösche, funktioniert es wie erwartet, aber in meinem Produktionscode benötige ich einen Programmfluss ähnlich der Beispielquelle. – IcePic
@IcePic kann stattdessen "Nebenläufigkeit :: Aufgabe" verwenden. Unter VC++ ist 'std :: async' ohnehin ein dünner Wrapper um Aufgaben. –