Sobes.tech
Middle

Czym jest std::future w C++?

sobes.tech AI

Odpowiedź od AI

std::future — to szablonowa klasa w C++, reprezentująca wynik (wartość lub wyjątek) operacji asynchronicznej, który będzie dostępny w przyszłości. Służy do pobierania wyniku zadania uruchomionego w osobnym wątku lub za pomocą std::async.

Kluczowe cechy:

  • Asynchroniczność: Pozwala wykonać operację bez blokowania bieżącego wątku.
  • Pobieranie wyniku: Metoda get() pozwala uzyskać wynik. Jeśli wynik nie jest jeszcze dostępny, get() zablokuje bieżący wątek do czasu jego dostępności lub wystąpienia wyjątku.
  • Przekazywanie danych: Powiązany z obiektem std::promise, który umożliwia ustawienie wyniku lub wyjątku.
  • Stan: std::future ma stan wskazujący, czy wynik jest gotowy. Można to sprawdzić za pomocą wait() lub wait_for().
  • Jednorazowe pobranie: Metoda get() może być wywołana tylko raz dla każdego obiektu std::future.
  • Typ wyniku: Typizowany przez typ zwracanego wyniku operacji asynchronicznej.

Przykład użycia z std::async:

#include <future>
#include <thread>
#include <chrono>
#include <iostream>

int calculate_something() {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    return 42;
}

// Przykład użycia std::future z std::async
int main() {
    // Uruchamiamy operację asynchroniczną
    std::future<int> result_future = std::async(std::launch::async, calculate_something);

    // Wykonujemy inną pracę, podczas gdy operacja jest obliczana
    std::cout << "Robię coś innego..." << std::endl;

    // Pobieramy wynik (blokuje, jeśli nie jest gotowy)
    int result = result_future.get();
    std::cout << "Wynik to: " << result << std::endl;

    return 0;
}

Przykład użycia z 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));
    // Ustawiamy wynik
    promise_obj.set_value(123);
}

// Przykład użycia std::future z std::promise
int main() {
    // Tworzymy promise i future
    std::promise<int> promise_obj;
    std::future<int> future_obj = promise_obj.get_future();

    // Uruchamiamy worker w osobnym wątku, przekazując promise
    std::thread worker_thread(worker_function, std::move(promise_obj));

    // Wykonujemy inną pracę, podczas gdy worker działa
    std::cout << "Robię coś innego..." << std::endl;

    // Pobieramy wynik (blokuje, jeśli nie jest gotowy)
    int result = future_obj.get();
    std::cout << "Wynik od workera: " << result << std::endl;

    // Czekamy na zakończenie workera
    worker_thread.join();

    return 0;
}

Ważne metody std::future:

Metoda Opis
get() Pobiera wynik. Blokuje, jeśli wynik nie jest jeszcze dostępny. Może być wywołana tylko raz.
valid() Sprawdza, czy std::future jest powiązany z operacją asynchroniczną.
wait() Blokuje bieżący wątek do czasu, aż wynik będzie dostępny (lub zostanie rzucony wyjątek).
wait_for() Czeka na wynik przez określony czas. Zwraca stan oczekiwania.
wait_until() Czeka na wynik do określonego momentu w czasie. Zwraca stan oczekiwania.

std::future jest częścią biblioteki <future> i zapewnia wygodny sposób zarządzania wynikami obliczeń asynchronicznych, upraszczając rozwój aplikacji wielowątkowych.