Поделиться через


<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.

Если policylaunch::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.

См. также

<future>