Middle
Čo je std::future v C++?
sobes.tech AI
Odpoveď od AI
std::future — je šablónová trieda v C++, ktorá predstavuje výsledok (hodnotu alebo výnimku) asynchrónnej operácie, ktorá bude dostupná v budúcnosti. Používa sa na získanie výsledku vykonania úlohy spustenej v samostatnom vlákne alebo prostredníctvom std::async.
Kľúčové vlastnosti:
- Asynchrónnosť: Umožňuje vykonanie operácie bez blokovania aktuálneho vlákna.
- Získanie výsledku: Metóda
get()umožňuje získať výsledok. Ak výsledok ešte nie je pripravený,get()zablokuje aktuálne vlákno, kým nebude dostupný alebo kým nevypukne výnimka. - Prenos dát: Je spojená s objektom
std::promise, ktorý poskytuje spôsob, ako nastaviť výsledok alebo výnimku. - Stav:
std::futuremá stav, ktorý ukazuje, či je výsledok pripravený. Môže byť skontrolovaný pomocouwait()alebowait_for(). - Len raz: Metóda
get()môže byť volaná iba raz pre každý objektstd::future. - Typ výsledku: Typizovaný typom vracanej hodnoty asynchrónnej operácie.
Príklad použitia s std::async:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int calculate_something() {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
}
// Príklad použitia `std::future` s `std::async`
int main() {
// Spúšťame asynchrónnu operáciu
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Vykonávame inú prácu, zatiaľ čo operácia sa počíta
std::cout << "Doing something else..." << std::endl;
// Získavame výsledok (blokuje, ak nie je hotový)
int result = result_future.get();
std::cout << "Result is: " << result << std::endl;
return 0;
}
Príklad použitia s 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));
// Nastavujeme výsledok
promise_obj.set_value(123);
}
// Príklad použitia `std::future` s `std::promise`
int main() {
// Vytvárame promise a future
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Spúšťame worker v samostatnom vlákne, odovzdávajúc promise
std::thread worker_thread(worker_function, std::move(promise_obj));
// Vykonávame inú prácu, zatiaľ čo worker beží
std::cout << "Doing something else..." << std::endl;
// Získavame výsledok (blokuje, ak nie je hotový)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Čakáme na ukončenie worker vlákna
worker_thread.join();
return 0;
}
Dôležité metódy std::future:
| Metóda | Popis |
|---|---|
get() |
Získa výsledok. Blokuje, ak výsledok ešte nie je dostupný. Môže byť volaná iba raz. |
valid() |
Kontroluje, či je std::future spojené s asynchrónnou operáciou. |
wait() |
Blokuje aktuálne vlákno, kým nie je výsledok dostupný (alebo nevypukne výnimka). |
wait_for() |
Čaká na výsledok v danom časovom intervale. Vráti stav čakania. |
wait_until() |
Čaká na výsledok do daného časového okamihu. Vráti stav čakania. |
std::future je súčasťou knižnice <future> a poskytuje pohodlný spôsob správy výsledkov asynchrónnych výpočtov, čo uľahčuje vývoj viacvláknových aplikácií.