Sobes.tech
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::future má stav, ktorý ukazuje, či je výsledok pripravený. Môže byť skontrolovaný pomocou wait() alebo wait_for().
  • Len raz: Metóda get() môže byť volaná iba raz pre každý objekt std::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í.