Sobes.tech
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::promise objektu, kuris suteikia būdą nustatyti rezultatą arba išimtį.
  • Būklė: std::future turi būseną, kuri nurodo, ar rezultatas yra paruoštas. Patikrinti galima wait() arba wait_for().
  • Vienkartinis gavimas: get() metodas gali būti iškviestas tik vieną kartą kiekvienam std::future objektui.
  • 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ą.