Назад к вопросам
Middle
366
questionbank
Что такое std::future в C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
std::future — это класс-шаблон в C++, представляющий результат (значение или исключение) асинхронной операции, который станет доступным в будущем. Он используется для получения результата выполнения задачи, запущенной в отдельном потоке или посредством std::async.
Ключевые особенности:
- Асинхронность: Позволяет выполнить операцию, не блокируя текущий поток.
- Получение результата: Метод
get()позволяет получить результат операции. Если результат еще не готов,get()заблокирует текущий поток до его готовности или до получения исключения. - Передача данных: Связывается с объектом
std::promise, который предоставляет способ установить результат или исключение. - Состояние:
std::futureимеет состояние, указывающее, готов ли результат. Можно проверить с помощьюwait()илиwait_for(). - Однократное получение: Метод
get()можно вызвать только один раз для каждого объектаstd::future. - Тип результата: Типизируется типом возвращаемого значения асинхронной операции.
Пример использования с std::async:
#include <future>
#include <thread>
#include <chrono>
#include <iostream>
int calculate_something() {
std::this_thread::sleep_for(std::chrono::seconds(1));
return 42;
}
// Пример использования std::future с std::async
int main() {
// Запускаем асинхронную операцию
std::future<int> result_future = std::async(std::launch::async, calculate_something);
// Выполняем другую работу, пока операция считается
std::cout << "Doing something else..." << std::endl;
// Получаем результат (блокирует, если не готов)
int result = result_future.get();
std::cout << "Result is: " << result << std::endl;
return 0;
}
Пример использования с 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));
// Устанавливаем результат
promise_obj.set_value(123);
}
// Пример использования std::future с std::promise
int main() {
// Создаем promise и future
std::promise<int> promise_obj;
std::future<int> future_obj = promise_obj.get_future();
// Запускаем worker в отдельном потоке, передавая promise
std::thread worker_thread(worker_function, std::move(promise_obj));
// Выполняем другую работу, пока worker работает
std::cout << "Doing something else..." << std::endl;
// Получаем результат (блокирует, если не готов)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Ждем завершения worker потока
worker_thread.join();
return 0;
}
Важные методы std::future:
| Метод | Описание |
|---|---|
get() |
Получает результат. Блокирует, если результат еще не готов. Может быть вызван только один раз. |
valid() |
Проверяет, связан ли std::future с общим состоянием асинхронной операции. |
wait() |
Блокирует текущий поток до тех пор, пока результат не станет доступным (или не будет выброшено исключение). |
wait_for() |
Ожидает результат в течение заданного интервала времени. Возвращает статус ожидания. |
wait_until() |
Ожидает результат до заданного момента времени. Возвращает статус ожидания. |
std::future является частью библиотеки <future> и предоставляет удобный способ управления результатами асинхронных вычислений, упрощая разработку многопоточных приложений.