Обращения к set_value()
, set_value_at_thread_exit()
, set_exception()
и set_exception_at_thread_exit()
сериализуются. Успешное обращение к set_value()
происходит-раньше обращения к функции std::future
или std::shared_future
, которая извлекает сохраненное исключение.
STD::PROMISE::SET_EXCEPTION_AT_THREAD_EXIT,
ФУНКЦИЯ-ЧЛЕН
Сохраняет исключение в асинхронном результате, ассоциированном с *this
, но не делает этот результат готовым раньше момента завершения потока.
void set_exception_at_thread_exit(std::exception_ptr e);
С *this
ассоциирован асинхронный результат, (bool)e
равно true
.
Сохраняет e
в асинхронном результате, ассоциированном с *this
. Планирует перевод ассоциированного асинхронного результата в состояние готовности в момент завершения потока.
Асинхронный результат, ассоциированный с *this
, содержит исключение, но не является готовым до завершения текущего потока. Все потоки, ожидающие асинхронного результата, будут разблокированы, когда текущий поток завершится.
Исключение типа std::future_error
с кодом ошибки std::future_errc::promise_already_satisfied
, если в асинхронном результате уже находится значение или исключение.
Обращения к set_value()
, set_value_at_thread_exit()
, set_exception()
и set_exception_at_thread_exit()
сериализуются. Успешное обращение к set_value()
происходит-раньше обращения к функции std::future
или std::shared_future
, которая извлекает сохраненное исключение.
D.4.5. Шаблон функции std::async
Шаблон функции std::async
дает простой способ выполнить автономную асинхронную задачу с использованием доступного аппаратного параллелизма. Обращение к std::async
возвращает объект std::future
, который содержит результат задачи. В зависимости от политики запуска задача выполняется либо асинхронно в отдельном потоке, либо синхронно в том потоке, который вызвал функции-члены wait()
или get()
объекта std::future
.
enum class launch {
async, deferred
};
template
future
async(Callable&& func, Args&& ... args);
template
future
async(launch policy, Callable&& func, Args&& ... args);
Выражение INVOKE(func, args)
допустимо для переданных значений func
и args
. Тип Callable
и все члены Args
удовлетворяют требованиям концепции MoveConstructible
.
Конструирует копии func
и args...
во внутренней памяти (далее обозначаются fff
и xyz...
соответственно).
Если policy
равно std::launch::async
, то вызывает функцию INVOKE(fff, xyz...)
в отдельном потоке. Возвращенный объект std::future
становится std::future
, блокирует поток, пока будущий результат не будет
Если policy
равно std::launch::deferred
, то fff
и xyz...
сохраняются в возвращенном объекте std::future
как отложенный вызов функции. При первом обращении к функции-члену wait()
или get()
будущего результата, который разделяет то же самое ассоциированное состояние, функция INVOKE(fff, xyz...)
синхронно вызывается в потоке, который обратился к wait()
или get()
.
В ответ на вызов функции get()
этого объекта std::future
либо возвращается значение, полученное от INVOKE(fff, xyz...)
, либо возбуждается исключение, которое имело место в этой функции.
Если policy
равно std::launch::async | std::launch::deferred
или аргумент policy
опущен, то поведение такое же, как если бы была задана политика std::launch::async
или std::launch::deferred
. Реализация сама выбирает нужное поведение при каждом вызове, чтобы в максимальной степени задействовать доступный аппаратный параллелизм, не вызывая при этом превышения лимита.
В любом случае функция std::async
возвращает управление немедленно.