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


<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++ указывает, что если политика запущена::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.

См. также

<future>