Стандартная библиотека C++<future>
Введено в C++11<future>Заголовочный файл предоставляет механизм для асинхронного программирования, позволяя программе продолжать выполнять другие задачи во время ожидания завершения операции.<future>Библиотека является частью параллельного программирования в стандартной библиотеке C++, позволяя программистам работать с асинхронными операциями более кратким и безопасным способом.
<future>Библиотека определяет несколько ключевых типов:
std::future: Представляет результат асинхронной операции, позволяя запросить состояние операции, получить результат или дождаться завершения операции.std::promise: используется сstd::futureв паре, используется для установки результата асинхронных операций.std::packaged_task: Оборачивает функцию или вызываемый объект, чтобы его можно было выполнить как асинхронную задачу.
std::promise
std::promiseИспользуется для установки результата асинхронных операций. Он используется в паре сstd::futureиспользуются парами.
Пример
#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 <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 <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 <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++. При этом механизм обработки исключений также обеспечивает надёжность программы.