Класс promise
Класс promise предоставляет механизм для сохранения значения или исключения, которое затем асинхронно извлекается через связанный объект future. Класс является шаблонным и принимает тип сохраняемого значения. Объект promise создается в одном потоке, а связанный с ним future может быть получен в другом потоке с помощью метода get_future. Значение устанавливается методом set_value, а исключение - методом set_exception.
Синтаксис
#include <future>
std::promise<T> p;
std::future<T> f = p.get_future();
Пример
Давайте создадим объект promise для типа int, получим связанный future и установим значение 42:
#include <iostream>
#include <future>
using namespace std;
int main()
{
promise<int> p;
future<int> f = p.get_future();
p.set_value(42);
cout << f.get() << endl;
return 0;
}
Результат выполнения кода:
42
Пример
Давайте передадим значение из одного потока в другой с помощью promise и future:
#include <iostream>
#include <future>
#include <thread>
using namespace std;
void worker(promise<string> p)
{
p.set_value("abcde");
}
int main()
{
promise<string> p;
future<string> f = p.get_future();
thread t(worker, move(p));
t.join();
cout << f.get() << endl;
return 0;
}
Результат выполнения кода:
"abcde"
Пример
Давайте установим исключение через promise и перехватим его при вызове метода get:
#include <iostream>
#include <future>
#include <stdexcept>
using namespace std;
int main()
{
promise<int> p;
future<int> f = p.get_future();
p.set_exception(make_exception_ptr(runtime_error("error")));
try
{
cout << f.get() << endl;
}
catch (const exception& e)
{
cout << e.what() << endl;
}
return 0;
}
Результат выполнения кода:
"error"
Смотрите также
-
класс
future,
который представляет асинхронный результат -
метод
set_value,
который устанавливает значение в promise -
метод
set_exception,
который устанавливает исключение в promise -
метод
get_future,
который возвращает связанный future