Sobes.tech
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::future ima stanje koje ukazuje da li je rezultat spreman. Može se proveriti pomoću wait() ili wait_for().
  • Samo jednom: Metod get() može biti pozvan samo jednom za svaki objekat std::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.