Czy można sprawdzić, czy std::future
skończył się, czy nie? O ile wiem, jedynym sposobem byłoby zadzwonić wait_for
z zerowym czasem trwania i sprawdzić, czy status jest, ready
czy nie, ale czy jest lepszy sposób?
c++
multithreading
c++11
future
David Brown
źródło
źródło
valid
sprawdza tylko, czy przyszłość ma stan współdzielony (tj. Powraca,true
dopóki nieget
zostanie wywołana w przyszłości).get
został wywołany i zwraca przechowywaną wartość, czy nadal chcesztrue
? (Nie jestem pewien, dlaczego miałoby to być przydatne, ponieważ wartość można uzyskać tylko raz.)QFuture::isFinished
.Odpowiedzi:
Masz rację i oprócz dzwonienia
wait_until
z czasem w przeszłości (co jest równoważne) nie ma lepszego sposobu.Zawsze możesz napisać małe opakowanie, jeśli chcesz wygodniejszej składni:
template<typename R> bool is_ready(std::future<R> const& f) { return f.wait_for(std::chrono::seconds(0)) == std::future_status::ready; }
Uwaga: jeśli funkcja jest odroczona, nigdy nie zwróci ona wartości true, więc prawdopodobnie lepiej sprawdzić
wait_for
bezpośrednio w przypadku, gdy chcesz uruchomić odroczone zadanie synchronicznie po upływie określonego czasu lub gdy obciążenie systemu jest niskie.źródło
for(int i = 0; i < 1000; i++) f.wait_for(chrono::seconds(0));
zajmuje 43 ms czasu zegara ściennego.W pracach dla std :: future istnieje funkcja składowa is_ready . W międzyczasie implementacja VC ma element członkowski _Is_ready ().
źródło
Mój pierwszy zakład byłoby zadzwonić
wait_for
z 0 trwania, i sprawdzić kod wynik, który może być jednym zfuture_status::ready
,future_status::deferred
lubfuture_status::timeout
.W cppreference twierdzą, że
valid()
sprawdza, czy wynik jest dostępny , ale standard mówi, żevalid()
zwróci,true
jeśli*this
odnosi się do wspólnego stanu, niezależnie od tego, czy ten stan jest gotowy, czy nie.źródło