Condividi tramite


<future> funzioni

async
future_category
make_error_code
make_error_condition
swap|

async

Rappresenta un provider asincrono.

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);

Parametri

policy
Valore launch.

Osservazioni:

Definizioni delle abbreviazioni:

Abbreviazione Descrizione
dfn Risultato della chiamata a decay_copy(forward<Fn>(fn)).
dargs Risultati delle chiamate decay_copy(forward<ArgsTypes>(args...)).
Ty Tipo result_of<Fn(ArgTypes...)>::type.

La prima funzione modello restituisce async(launch::any, fn, args...).

La seconda funzione restituisce un future<Ty> oggetto il cui stato asincrono associato contiene un risultato insieme ai valori di dfn e dargs e a un oggetto thread per gestire un thread di esecuzione separato.

A meno che decay<Fn>::type non sia un tipo diverso dall'avvio, la seconda funzione non partecipa alla risoluzione dell'overload.

Lo standard C++ indica che se il criterio è launch::async, la funzione si comporta come se richiamasse l'oggetto chiamabile in un nuovo thread. Ciò significa che, mentre in genere comporta la creazione di un nuovo thread, l'implementazione può usare altri meccanismi per ottenere un comportamento equivalente. Tuttavia, l'implementazione di Microsoft attualmente non è conforme strettamente a questo comportamento. Ottiene i thread da Windows ThreadPool, che possono fornire un thread riciclato anziché un nuovo thread. Ciò significa che i launch::async criteri vengono implementati in modo efficace come launch::async|launch::deferred. Un'altra implicazione dell'implementazione basata su ThreadPool è che non esiste alcuna garanzia che le variabili locali del thread vengano eliminate definitivamente al termine del thread. Se il thread viene riciclato e fornito a una nuova chiamata a async, le variabili precedenti esistono ancora. È consigliabile evitare di usare variabili locali del thread con async.

Se policy è launch::deferred, la funzione contrassegna il relativo stato asincrono associato come contenente una funzione posticipata e termina. La prima chiamata a qualsiasi funzione non timed che attende che lo stato asincrono associato sia pronto in effetti chiama la funzione posticipata valutando INVOKE(dfn, dargs..., Ty).

In tutti i casi, lo stato asincrono associato dell'oggetto future non è impostato su pronto fino al completamento della INVOKE(dfn, dargs..., Ty) valutazione, generando un'eccezione o restituendo normalmente. Il risultato dello stato asincrono associato è un'eccezione se ne è stata generata una o il valore restituito dalla valutazione.

Nota

Per un oggetto future, o l'ultimo shared_future, collegato a un'attività avviata con std::async, il distruttore blocca se l'attività non è stata completata, ovvero blocca se il thread non ha ancora chiamato .get() o .wait() e l'attività è ancora in esecuzione. Se un oggetto future ottenuto da std::async viene spostato al di fuori dell'ambito locale, l'altro codice che lo usa deve tenere presente che il relativo distruttore può bloccarsi per consentire allo stato condiviso di diventare ready.

La pseudo-funzione INVOKE è definita in <functional>.

Specifico di Microsoft

Quando la funzione passata viene eseguita in modo asincrono, viene eseguita nel pool di thread di Windows. Per altre informazioni, vedere Pool di thread. Il numero di thread simultanei è limitato all'impostazione predefinita del pool di thread, ovvero 500 thread.

Prima di Windows 11 e Windows Server 2022, le applicazioni erano limitate per impostazione predefinita a un singolo gruppo di processori con al massimo 64 processori logici. In questo modo il numero di thread in esecuzione simultanea è limitato a 64. Per altre informazioni, vedere Gruppi di processori.

A partire da Windows 11 e Windows Server 2022, i processi e i relativi thread hanno affinità di processore che per impostazione predefinita si estendono a tutti i processori nel sistema e in più gruppi in computer con più di 64 processori. Il limite per il numero di thread simultanei è ora il numero totale di processori logici nel sistema.

future_category

Restituisce un riferimento all'oggetto error_category che caratterizza gli errori associati agli oggetti future.

const error_category& future_category() noexcept;

make_error_code

Crea un oggetto error_code insieme all'oggetto error_category che caratterizza gli errori future.

inline error_code make_error_code(future_errc Errno) noexcept;

Parametri

Errno
Valore future_errc che identifica l'errore segnalato.

Valore restituito

error_code(static_cast<int>(Errno), future_category());

make_error_condition

Crea un oggetto error_condition insieme all'oggetto error_category che caratterizza gli future errori.

inline error_condition make_error_condition(future_errc Errno) noexcept;

Parametri

Errno
Valore future_errc che identifica l'errore segnalato.

Valore restituito

error_condition(static_cast<int>(Errno), future_category());

swap

Scambia lo stato asincrono associato di un oggetto promise con quello di un altro oggetto.

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;

Parametri

Left
L'oggetto promise a sinistra.

Right
L'oggetto promise corretto.

Vedi anche

<future>