Middle
Co je to std::future v C++?
sobes.tech AI
Odpověď od AI
std::future — je třída šablony v C++, která představuje výsledek (hodnotu nebo výjimku) asynchronní operace, která bude dostupná v budoucnu. Používá se k získání výsledku provedení úkolu spuštěného v samostatném vlákně nebo prostřednictvím std::async.
Klíčové vlastnosti:
- Asynchronnost: Umožňuje provést operaci, aniž by blokovala aktuální vlákno.
- Získání výsledku: Metoda
get()umožňuje získat výsledek operace. Pokud výsledek ještě není připraven,get()zablokuje aktuální vlákno, dokud nebude dostupný nebo dokud nebude vyhozena výjimka. - Předání dat: Je spojena s objektem
std::promise, který poskytuje způsob, jak nastavit výsledek nebo výjimku. - Stav:
std::futuremá stav, který ukazuje, zda je výsledek připraven. Lze jej zkontrolovat pomocíwait()nebowait_for(). - Pouze jednou: Metoda
get()může být volána pouze jednou pro každý objektstd::future. - Typ výsledku: Je typizován typem vrácené hodnoty asynchronní operace.
Příklad použití 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;
}
// Příklad použití `std::future` s `std::async`
int main() {
// Spouštíme asynchronní operaci
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Provádíme jinou práci, zatímco operace probíhá
std::cout << "Doing something else..." << std::endl;
// Získání výsledku (blokuje, pokud není hotovo)
int result = result_future.get();
std::cout << "Result is: " << result << std::endl;
return 0;
}
Příklad použití 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));
// Nastavení výsledku
promise_obj.set_value(123);
}
// Příklad použití `std::future` s `std::promise`
int main() {
// Vytvoření promise a future
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Spuštění workeru v samostatném vlákně, předání promise
std::thread worker_thread(worker_function, std::move(promise_obj));
// Provádíme jinou práci, zatímco worker běží
std::cout << "Doing something else..." << std::endl;
// Získání výsledku (blokuje, pokud není hotovo)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Čekání na ukončení worker vlákna
worker_thread.join();
return 0;
}
Důležité metody std::future:
| Metoda | Popis |
|---|---|
get() |
Získá výsledek. Blokuje, pokud není ještě dostupný. Může být volána pouze jednou. |
valid() |
Kontroluje, zda je std::future spojeno s asynchronní operací. |
wait() |
Blokuje aktuální vlákno, dokud není výsledek dostupný (nebo nevypukne výjimka). |
wait_for() |
Čeká na výsledek po zadaném časovém intervalu. Vrací stav čekání. |
wait_until() |
Čeká na výsledek do zadaného časového okamžiku. Vrací stav čekání. |
std::future je součástí knihovny <future> a poskytuje pohodlný způsob správy výsledků asynchronních výpočtů, což usnadňuje vývoj vícevláknových aplikací.