Middle
Kas yra std::future C++-e?
sobes.tech AI
Atsakymas iš AI
std::future — tai C++ šablono klasė, kuri atstovauja asinchroninės operacijos rezultatą (reikšmę arba išimtį), kuris bus prieinamas ateityje. Ji naudojama užduoties vykdymo rezultato gavimui, kuris buvo pradėtas atskirame sraute arba per std::async:
Pagrindinės savybės:
- Asinchroniškumas: leidžia vykdyti operaciją, neblokuojant dabartinio srauto.
- Rezultato gavimas:
get()metodas leidžia gauti operacijos rezultatą. Jei rezultatas dar nėra paruoštas,get()blokuos dabartinį srautą iki jo paruošimo arba išimties išmetimo. - Duomenų perdavimas: susijęs su
std::promiseobjektu, kuris suteikia būdą nustatyti rezultatą arba išimtį. - Būklė:
std::futureturi būseną, kuri nurodo, ar rezultatas yra paruoštas. Patikrinti galimawait()arbawait_for(). - Vienkartinis gavimas:
get()metodas gali būti iškviestas tik vieną kartą kiekvienamstd::futureobjektui. - Rezultato tipas: nurodomas pagal asinchroninės operacijos grąžinamą reikšmę.
Pavyzdys naudojant su std::async:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int calculate_something() {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
}
// Pavyzdys naudojant `std::future` su `std::async`
int main() {
// Pradedame asinchroninę operaciją
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Atliekame kitus darbus, kol operacija skaičiuojama
std::cout << "Doing something else..." << std::endl;
// Gauname rezultatą (blokuojama, jei dar neparuoštas)
int result = result_future.get();
std::cout << "Result is: " << result << std::endl;
return 0;
}
Pavyzdys naudojant su 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));
// Nustatome rezultatą
promise_obj.set_value(123);
}
// Pavyzdys naudojant `std::future` su `std::promise`
int main() {
// Sukuriame `promise` ir `future`
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Paleidžiame workerį atskirame sraute, perduodant `promise`
std::thread worker_thread(worker_function, std::move(promise_obj));
// Atliekame kitus darbus, kol workeris dirba
std::cout << "Doing something else..." << std::endl;
// Gauname rezultatą (blokuojama, jei dar neparuoštas)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Laukiame worker srauto pabaigos
worker_thread.join();
return 0;
}
Svarbiausi std::future metodai:
| Metodas | Aprašymas |
|---|---|
get() |
Gauna rezultatą. Blokuoja, jei rezultatas dar nėra paruoštas. Gali būti iškviestas tik vieną kartą. |
valid() |
Patikrina, ar std::future yra susijęs su bendru asinchroninės operacijos būsenos. |
wait() |
Blokuoja dabartinį srautą iki rezultatas tampa prieinamas (arba išmetama išimtis). |
wait_for() |
Laukia rezultato tam tikrą laiką. Grąžina laukimo būseną. |
wait_until() |
Laukia rezultato iki nurodyto laiko momento. Grąžina laukimo būseną. |
std::future yra <future> bibliotekos dalis ir suteikia patogų būdą valdyti asinchroninių skaičiavimų rezultatus, palengvindamas daugiagijų programų kūrimą.