<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);
Параметры
policy
Значение 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
.
Если policy
— launch::deferred
, функция помечает свое связанное асинхронное состояние как имеющую отложенную функцию и возвращается. Первый вызов любой невременной функции, ожидающей готовности связанного асинхронного состояния, вызывает отложенную функцию, оценивая INVOKE(dfn, dargs..., Ty)
.
Во всех случаях связанное асинхронное состояние future
объекта не будет готово до завершения оценки INVOKE(dfn, dargs..., Ty)
либо путем создания исключения, либо путем нормального возврата. Результатом связанного асинхронного состояния является исключение, если он был создан, или значение, возвращаемое вычислением.
Примечание.
future
Если задача не завершена, или последняяshared_future
, присоединенная к задаче, запущенаstd::async
, деструктор блокируется, если задача не завершена; то есть блокируется, если этот поток еще не вызывается .get()
или .wait()
задача по-прежнему выполняется. Если future
, полученный из std::async
, перемещается за пределы локальной области, другой код, который его использует, должен знать, что деструктор может заблокировать переход в общее состояние "ready".
Псевдофукционная функция INVOKE
определена в <functional>
.
Только для систем Майкрософт
Когда переданная функция выполняется асинхронно, она выполняется в пуле потоков Windows. Дополнительные сведения см. в разделе "Пулы потоков". Число параллельных потоков ограничено пулом потоков по умолчанию, что составляет 500 потоков.
До Windows 11 и Windows Server 2022 приложения по умолчанию были ограничены одной группой процессоров, имеющей не более 64 логических процессоров. Это ограничивает число одновременных выполнения потоков до 64. Дополнительные сведения см. в разделе "Группы обработчиков".
Начиная с Windows 11 и Windows Server 2022, процессы и их потоки имеют сходство процессоров, которые по умолчанию охватывают все процессоры в системе и между несколькими группами на компьютерах с более чем 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
.