Sobes.tech
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::future má stav, který ukazuje, zda je výsledek připraven. Lze jej zkontrolovat pomocí wait() nebo wait_for().
  • Pouze jednou: Metoda get() může být volána pouze jednou pro každý objekt std::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í.