<future>
Функции
async
future_category
make_error_code
make_error_condition
swap
|
async
Представляет асинхронного поставщика.
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(Fn&& fn, ArgTypes&&... args);
template <class Fn, class... ArgTypes>
future<typename result_of<Fn(ArgTypes...)>::type>
async(launch policy, Fn&& fn, ArgTypes&&... args);
Параметры
политика
Значение launch
.
Замечания
Определения сокращений:
Сокращение | Description |
---|---|
dfn |
Результат вызова метода decay_copy(forward<Fn>(fn)) . |
dargs |
Результаты вызовов decay_copy(forward<ArgsTypes>(args...)) . |
Ty |
Тип result_of<Fn(ArgTypes...)>::type . |
Первая функция-шаблон возвращает async(launch::any, fn, args...)
.
Вторая функция возвращает объект, связанный future<Ty>
с асинхронным состоянием которого содержит результат вместе со значениями dfn
и dargs
объектом потока для управления отдельным потоком выполнения.
Если decay<Fn>::type
тип, отличный от запуска, вторая функция не участвует в разрешении перегрузки.
Стандарт C++ указывает, что если политика является launch::async
, функция ведет себя так, как если бы она вызывала вызываемый объект в новом потоке. Это означает, что, хотя обычно это приводит к созданию нового потока, реализация может использовать другие механизмы для достижения эквивалентного поведения. Однако реализация Майкрософт в настоящее время не соответствует этому поведению. Он получает свои потоки из Windows ThreadPool, который может предоставить переработанный поток, а не новый. Это означает, что launch::async
политика эффективно реализуется как launch::async|launch::deferred
. Еще одним последствием реализации На основе ThreadPool является отсутствие гарантии того, что локальные потоковые переменные будут уничтожены при завершении потока. Если поток перезапускается и предоставляется для нового вызова async
, старые переменные по-прежнему будут существовать. Рекомендуется избегать использования локальных переменных потока с async
.
Если политика задана launch::deferred
, функция помечает связанное асинхронное состояние как удержание отложенной функции и возвращает. Первый вызов любой функции без учета времени, которая ожидает наступления связанного асинхронного состояния "ready", фактически вызывает отложенную функцию путем оценки INVOKE(dfn, dargs..., Ty)
.
Во всех случаях связанное асинхронное состояние future
объекта не будет готово до завершения оценки INVOKE(dfn, dargs..., Ty)
либо путем создания исключения, либо путем нормального возврата. Результатом связанного асинхронного состояния получается исключение, если таковое было создано, или любое значение, возвращаемое при оценке.
Примечание.
future
Если задача не завершена, или последняяshared_future
, присоединенная к задаче, запущенаstd::async
, деструктор блокируется, если задача не завершена; то есть блокируется, если этот поток еще не вызывается .get()
или .wait()
задача по-прежнему выполняется. Если future
, полученный из std::async
, перемещается за пределы локальной области, другой код, который его использует, должен знать, что деструктор может заблокировать переход в общее состояние "ready".
Псевдофукционная функция INVOKE
определена в <functional>
.
Блок, относящийся только к системам Майкрософт
Когда переданная функция выполняется асинхронно, она выполняется в пуле потоков Windows; см. статью "Пулы потоков". Число параллельных потоков ограничено значением по умолчанию пула потоков (в настоящее время — 500). Число потоков, одновременно выполняемых на оборудовании, в настоящее время ограничено числом логических процессоров в группе процессоров процесса, поэтому он фактически ограничен 64; см. раздел "Группы обработчиков".
future_category
Возвращает ссылку на объект error_category, характеризующий ошибки, связанные с объектами future
.
const error_category& future_category() noexcept;
make_error_code
Создает error_code вместе с объектом error_category, характеризующий ошибки future.
inline error_code make_error_code(future_errc Errno) noexcept;
Параметры
Errno
Значение future_errc, идентифицирующее ошибку.
Возвращаемое значение
error_code(static_cast<int>(Errno), future_category());
make_error_condition
Создает error_condition вместе с объектом error_category, характеризующий ошибки future.
inline error_condition make_error_condition(future_errc Errno) noexcept;
Параметры
Errno
Значение future_errc, идентифицирующее ошибку.
Возвращаемое значение
error_condition(static_cast<int>(Errno), future_category());
swap
Меняет местами связанное асинхронное состояние одного объекта promise
с объектом другого объекта.
template <class Ty>
void swap(promise<Ty>& Left, promise<Ty>& Right) noexcept;
template <class Ty, class... ArgTypes>
void swap(packaged_task<Ty(ArgTypes...)>& Left, packaged_task<Ty(ArgTypes...)>& Right) noexcept;
Параметры
Left
Левый объект promise
.
Right
Правой объект promise
.