Стандартная библиотека C++<future>

Введено в C++11<future>Заголовочный файл предоставляет механизм для асинхронного программирования, позволяя программе продолжать выполнять другие задачи во время ожидания завершения операции.<future>Библиотека является частью параллельного программирования в стандартной библиотеке C++, позволяя программистам работать с асинхронными операциями более кратким и безопасным способом.

<future>Библиотека определяет несколько ключевых типов:

  • std::future: Представляет результат асинхронной операции, позволяя запросить состояние операции, получить результат или дождаться завершения операции.
  • std::promise: используется сstd::futureв паре, используется для установки результата асинхронных операций.
  • std::packaged_task: Оборачивает функцию или вызываемый объект, чтобы его можно было выполнить как асинхронную задачу.

std::promise

std::promiseИспользуется для установки результата асинхронных операций. Он используется в паре сstd::futureиспользуются парами.

Пример

#include <iostream>
#include <future>

int main() {
    std::promise<int> prom;
    std::future<int> fut = prom.get_future();

    // Установить результат в другом потоке
    std::thread t([prom]() {
        prom.set_value(10);
    });

    // Дождаться результата
    std::cout << "Значение future: " << fut.get() << std::endl;

    t.join();
    return 0;
}

Результат вывода:

Future value: 10

std::packaged_task

std::packaged_taskОборачивает функцию или вызываемый объект так, чтобы его можно было выполнить как асинхронную задачу.

Пример

#include <iostream>
#include <future>
#include <cmath>

int compute_square_root(double x) {
    return std::sqrt(x);
}

int main() {
    std::packaged_task<double(double)> task(compute_square_root);
    std::future<double> result = task.get_future();
    std::thread th(std::move(task), 9.0);

    std::cout << "Результат: " << result.get() << std::endl;
    th.join();
    return 0;
}

Результат вывода:

Result: 3

std::async

std::asyncЯвляется удобной функцией для запуска асинхронных задач. Она может немедленно вернутьstd::futureОбъект.

Пример

#include <iostream>
#include <future>

int main() {
    std::future<int> fut = std::async(std::launch::async, [](int x) {
        return x * x;
    }, 5);

    std::cout << "Result: " << fut.get() << std::endl;
    return 0;
}

Результат вывода:

Result: 25

Обработка исключений

Когда асинхронная операция выбрасывает исключение,std::futureПерехватит это исключение и может, вызвав.get()метод, чтобы повторно его выбросить.

Пример

#include <iostream>
#include <future>

void throw_exception() {
    throw std::runtime_error("Exception thrown");
}

int main() {
    std::future<void> fut = std::async(throw_exception);

    try {
        fut.get();
    } catch (const std::exception& e) {
        std::cout << "Caught exception: " << e.what() << std::endl;
    }
    return 0;
}

Результат вывода:

Caught exception: Exception thrown

<future>Библиотека предоставляет программистам на C++ простой и мощный способ асинхронного программирования. Используяstd::promise、std::packaged_taskиstd::async, мы можем легко реализовывать параллельные и асинхронные операции в программах на C++. При этом механизм обработки исключений также обеспечивает надёжность программы.

Другие расширения