Обращения к set_value()
set_value_at_thread_exit()
, set_exception()
и set_exception_at_thread_exit()
сериализуются. Успешное обращение к set_value()
происходит-раньше обращения к функции std::future::get()
или std::shared_future::get()
, которая извлекает сохраненное исключение.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::get()
или std::shared_future::get()
, которая извлекает сохраненное исключение.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