Ich möchte ein Objekt Delay
asynchron erstellen und dann (aus einem anderen Thread) wiederholt eine Funktion foo
von diesem Objekt aufrufen.aufrufen std :: future :: get wiederholt
struct Delay {
Delay(int d) {
sleep(d);
}
void foo() { }
};
struct Test {
Test() {
x = async(std::launch::async,
[&]() {return std::make_unique<Delay>(4);});
}
void run() { x.get()->foo(); }
std::future<std::unique_ptr<Delay>> x;
};
int main() {
auto t = Test();
// do other stuff...
t.run();
t.run(); // throwing an instance of 'std::future_error', "No associated state"
return 0;
}
Allerdings wird das zweite Mal, dass x.get() aufgerufen wird, eine Ausnahme ausgelöst.
Was ist der empfohlene Weg, um mit einer solchen Situation umzugehen? Die Verwendung einer Flagge, wie unten gezeigt, erscheint wie ein Hack. Gibt es einen besseren Weg?
bool is_set = false;
std::unique_ptr<Delay> ptr;
void run_ptr() {
if (!is_set) {
ptr = x.get();
is_set = true;
}
ptr->out();
}