Ce face std::future
std::future<T> este „capătul de citire” al unui rezultat calculat în altă parte. Îl primești de la std::async, de la std::promise::get_future() sau de la std::packaged_task.
get() așteaptă până când rezultatul este gata și îl returnează (sau aruncă excepția produsă). Se poate apela o singură dată; după aceea valid() devine false. wait() doar așteaptă, iar wait_for(durata) așteaptă cel mult durata dată și returnează std::future_status::ready sau timeout.
Ce returnează
get() returnează valoarea de tip T.
Exemple
Exemplul 1: valid() înainte și după get()
#include <future>
#include <print>
int main() {
std::future<int> f = std::async(std::launch::async, [] { return 6 * 7; });
std::println("valid: {}", f.valid());
std::println("rezultat: {}", f.get());
std::println("valid după get: {}", f.valid());
}
Rezultat
valid: true
rezultat: 42
valid după get: false
Exemplul 2: Așteptare cu limită de timp
Calculul durează 200 ms, iar prima așteptare doar 50 ms, deci expiră. Rezultatul este același la fiecare rulare, pentru că diferența de timp este mare.
#include <chrono>
#include <future>
#include <print>
#include <thread>
int main() {
using namespace std::chrono_literals;
auto f = std::async(std::launch::async, [] {
std::this_thread::sleep_for(200ms);
return 100;
});
if (f.wait_for(50ms) == std::future_status::timeout) {
std::println("Încă se calculează...");
}
f.wait();
std::println("Gata: {}", f.get());
}
Rezultat
Încă se calculează...
Gata: 100
Greșeli frecvente
- Apelezi
get()a doua oară. Comportamentul este nedefinit (cu libc++ programul se poate opri brusc); salvează valoarea într-o variabilă sau verifică întâivalid().
Comenzi înrudite
std::async: Rulează o funcție (de obicei pe alt fir) și îți dă un std::future din care iei rezultatul mai târziu.std::promise: Capătul de scriere al unui std::future: un fir promite o valoare și o trimite cu set_value.std::condition_variable: Permite unui fir să aștepte, fără să consume procesor, până când alt fir îl anunță că o condiție s-a îndeplinit.