Назад к вопросам
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> и предоставляет удобный способ управления результатами асинхронных вычислений, упрощая разработку многопоточных приложений.