2016-07-02 2 views
0

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(); 
} 

Antwort

1

std::shared_future ist der empfohlene Weg, um mit einer solchen Situation fertig zu werden.

Es kann durch den Wechsel von einer Zukunft konstruiert werden und unterstützt mehrere Leser seines Zustandes. Es ist ein eindeutiges Objekt, weil die Zukunft mit einer Lieferung bestimmte Leistungsverbesserungen hatte und weil es so trivial ist, eine gemeinsame Zukunft zu machen, wenn Sie sie brauchen.

Ändern Sie einfach den Typ x zu und Sie sind fertig.

Beachten Sie jedoch, dass in Ihrem oben genannten Fall die unique_ptr Schicht meist sinnlos ist. Wahrscheinlich ist es in deinem echten Problem nicht.