<future>
– funkce
async
future_category
make_error_code
make_error_condition
swap
|
async
Představuje asynchronního zprostředkovatele.
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);
Parametry
policy
Hodnota launch
.
Poznámky
Definice zkratek:
Zkratka | Popis |
---|---|
dfn |
Výsledek volání funkce decay_copy(forward<Fn>(fn)) . |
dargs |
Výsledky volání funkce decay_copy(forward<ArgsTypes>(args...)) . |
Ty |
Typ result_of<Fn(ArgTypes...)>::type . |
První šablona funkce vrátí funkci async(launch::any, fn, args...)
.
Druhá funkce vrátí objekt, future<Ty>
jehož přidružený asynchronní stav obsahuje výsledek společně s hodnotami dfn
a dargs
objekt vlákna pro správu samostatného vlákna provádění.
Pokud decay<Fn>::type
není jiný typ než spuštění, druhá funkce se nepředstaví v rozlišení přetížení.
Standardní jazyk C++ uvádí, že pokud je launch::async
zásada , funkce se chová, jako by vyvolala volatelný objekt v novém vlákně. To znamená, že zatímco obvykle vede k vytvoření nového vlákna, implementace může k dosažení ekvivalentního chování použít jiné mechanismy. Implementace Microsoftu ale aktuálně nevyhovuje tomuto chování. Získá vlákna z Fondu vláken systému Windows, které mohou poskytnout recyklované vlákno místo nového vlákna. To znamená, že politika je účinně implementována launch::async
jako launch::async|launch::deferred
. Další implikací implementace založené na ThreadPoolu je, že neexistuje žádná záruka, že po dokončení vlákna jsou zničeny proměnné thread-local. Pokud je vlákno recyklováno a poskytováno novému volání async
, staré proměnné stále existují. Doporučujeme, abyste se vyhnuli používání místních proměnných vláken s async
.
Pokud policy
ano launch::deferred
, funkce označí přidružený asynchronní stav jako držení odložené funkce a vrátí. První volání jakékoli nečasované funkce, která čeká na připravenost přidruženého asynchronního stavu ve výsledku volá odloženou funkci vyhodnocením INVOKE(dfn, dargs..., Ty)
.
Ve všech případech není přidružený asynchronní stav objektu future
nastavený tak, aby byl připravený až do vyhodnocení INVOKE(dfn, dargs..., Ty)
dokončení, buď vyvoláním výjimky nebo normálním vrácením. Výsledkem přidruženého asynchronního stavu je výjimka, pokud byla vyvolán, nebo hodnota, kterou vyhodnocení vrátí.
Poznámka:
future
U úkolu ( nebo posledníhoshared_future
) připojeného k úkolu, který byl spuštěn std::async
, bloky destruktoru, pokud úkol nebyl dokončen; to znamená, že blokuje, pokud toto vlákno ještě nevolá .get()
nebo .wait()
úkol je stále spuštěný. Pokud je objekt future
získaný z volání funkce std::async
přesunut mimo místní rozsah, jiný kód, který jej používá, musí vědět, že jeho destruktor může být blokován, než sdílený stav změní na stav připraven.
Pseudofunkce INVOKE
je definována v <functional>
.
Specifické pro Microsoft
Když se předaná funkce spustí asynchronně, spustí se ve fondu vláken systému Windows. Další informace naleznete v tématu Fondy vláken. Počet souběžných vláken je omezen na výchozí fond vláken, což je 500 vláken.
Před Windows 11 a Windows Serverem 2022 byly aplikace ve výchozím nastavení omezeny na jednu skupinu procesorů, která má maximálně 64 logických procesorů. Tím se omezil počet souběžně spuštěných vláken na 64. Další informace naleznete v tématu Skupiny procesorů.
Počínaje Systémy Windows 11 a Windows Server 2022 mají procesy a jejich vlákna spřažení procesorů, které ve výchozím nastavení pokrývají všechny procesory v systému a napříč několika skupinami na počítačích s více než 64 procesory. Limit počtu souběžných vláken je teď celkový počet logických procesorů v systému.
future_category
Vrátí odkaz na error_category
objekt, který charakterizuje chyby spojené s future
objekty.
const error_category& future_category() noexcept;
make_error_code
Vytvoří error_code společně s objektem error_category, který charakterizuje budoucí chyby.
inline error_code make_error_code(future_errc Errno) noexcept;
Parametry
Errno
Hodnota future_errc
, která identifikuje hlášenou chybu.
Návratová hodnota
error_code(static_cast<int>(Errno), future_category());
make_error_condition
error_condition
Vytvoří společně s objektemerror_category
, který charakterizuje future
chyby.
inline error_condition make_error_condition(future_errc Errno) noexcept;
Parametry
Errno
Hodnota future_errc
, která identifikuje hlášenou chybu.
Návratová hodnota
error_condition(static_cast<int>(Errno), future_category());
swap
Vymění přidružený asynchronní stav jednoho promise
objektu s jiným objektem.
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;
Parametry
Left
Levý promise
objekt.
Right
Správný promise
objekt.