Middle
Šta je std::future u C++?
sobes.tech АИ
Одговор од АИ
std::future — to je šablonska klasa u C++, koja predstavlja rezultat (vrednost ili izuzetak) asinhrone operacije, koji će biti dostupan u budućnosti. Koristi se za dobijanje rezultata izvršenja zadatka pokrenutog u posebnom thread-u ili putem std::async.
Ključne osobine:
- Asinhronost: Omogućava izvršenje operacije bez blokiranja trenutnog thread-a.
- Dobijanje rezultata: Metod
get()omogućava dobijanje rezultata. Ako rezultat još nije spreman,get()će blokirati trenutni thread dok ne bude dostupan ili dok se ne baci izuzetak. - Prenos podataka: Povezuje se sa objektom
std::promise, koji pruža način za postavljanje rezultata ili izuzetka. - Stanje:
std::futureima stanje koje ukazuje da li je rezultat spreman. Može se proveriti pomoćuwait()iliwait_for(). - Samo jednom: Metod
get()može biti pozvan samo jednom za svaki objekatstd::future. - Tip rezultata: Tipiziran je tipom vraćene vrednosti asinhrone operacije.
Primer korišćenja sa std::async:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int calculate_something() {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
}
// Primer korišćenja `std::future` sa `std::async`
int main() {
// Pokrećemo asinhronu operaciju
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Obavljamo drugi posao dok se operacija računa
std::cout << "Doing something else..." << std::endl;
// Dobijamo rezultat (blokira ako nije spreman)
int result = result_future.get();
std::cout << "Result is: " << result << std::endl;
return 0;
}
Primer korišćenja sa std::promise:
#include <future>
#include <thread>
#include <iostream>
void worker_function(std::promise<int> promise_obj) {
std::this_thread::sleep_for(std::chrono::seconds(1));
// Postavljamo rezultat
promise_obj.set_value(123);
}
// Primer korišćenja `std::future` sa `std::promise`
int main() {
// Kreiramo promise i future
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Pokrećemo worker u posebnom thread-u, prosleđujući promise
std::thread worker_thread(worker_function, std::move(promise_obj));
// Obavljamo drugi posao dok worker radi
std::cout << "Doing something else..." << std::endl;
// Dobijamo rezultat (blokira ako nije spreman)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Čekamo završetak worker thread-a
worker_thread.join();
return 0;
}
Važne metode std::future:
| Metoda | Opis |
|---|---|
get() |
Dobija rezultat. Blokira ako rezultat još nije spreman. Može biti pozvana samo jednom. |
valid() |
Proverava da li je std::future povezan sa asinhronom operacijom. |
wait() |
Blokira trenutni thread dok rezultat ne postane dostupan (ili ne bude izuzetak). |
wait_for() |
Čeka rezultat u datom vremenskom intervalu. Vraća status čekanja. |
wait_until() |
Čeka rezultat do datog vremenskog trenutka. Vraća status čekanja. |
std::future je deo biblioteke <future> i pruža zgodan način za upravljanje rezultatima asinhronih izračuna, pojednostavljujući razvoj višestrukih niti.