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::futurema stan wskazujący, czy wynik jest gotowy. Można to sprawdzić za pomocąwait()lubwait_for(). - Jednorazowe pobranie: Metoda
get()może być wywołana tylko raz dla każdego obiektustd::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.