Middle
Какво е std::future в C++?
sobes.tech AI
Отговор от 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));
// Правим друга работа, докато работникът работи
std::cout << "Doing something else..." << std::endl;
// Получаваме резултата (блокира, ако не е готов)
int result = future_obj.get();
std::cout << "Result from worker: " << result << std::endl;
// Изчакваме завършването на работния поток
worker_thread.join();
return 0;
}
Важни методи на std::future:
| Метод | Описание |
|---|---|
get() |
Получава резултата. Блокира, ако резултатът все още не е готов. Може да бъде извикан само веднъж. |
valid() |
Проверява дали std::future е свързан с асинхронна операция. |
wait() |
Блокира текущия поток, докато резултатът не стане достъпен (или не бъде хвърлено изключение). |
wait_for() |
Изчаква резултата за зададения интервал от време. Връща статус на изчакване. |
wait_until() |
Изчаква резултата до зададения момент от време. Връща статус на изчакване. |
std::future е част от библиотеката <future> и предоставя удобен начин за управление на резултатите от асинхронни изчисления, улеснявайки разработката на многопоточни приложения.