2013-06-02 8 views
19

Una delle proposte per C++ 14 è Resumable Functions che fornisce a C++ ciò che è disponibile in C# oggi con i meccanismi asincrono/attesa. L'idea di base è che una funzione possa essere messa in pausa mentre si attende il completamento di un'operazione asincrona. Al termine dell'operazione asincrona, è possibile riprendere la funzione nel punto in cui è stata messa in pausa. Ciò avviene in modo non bloccante in modo che il thread da cui è stata richiamata la funzione di ripristino non sia bloccato.In quale contesto verranno ripristinate le funzioni in C++ 14?

Non è ovvio per me in quale contesto (thread) la funzione verrà ripresa. Sarà ripreso dal thread da cui è stata messa in pausa la funzione (questo è come viene fatto in C# come ho capito) o usa un altro thread?

Se viene ripreso dal thread da cui è stato sospeso, il thread deve essere messo in uno stato speciale o lo pianificatore lo gestirà?

+1

non ho idea di quello che hai chiesto, ma se la funzione di ripresa è non bloccante, quindi presumibilmente si restituisce una sorta di 'std :: optional' e il ricevitore deve verificare se il risultato è stato disponibile o non. Sembra che tu possa già codificare così con la meccanica attuale di 'std :: future' ...? –

+0

Non credo che la proposta sia stata adottata. – chris

+0

@Karrek SB: la proposta è collegata se si desidera leggerla. Hai ragione che i futures possono essere utilizzati per ottenere la stessa cosa (in genere anche con il futuro proposto). La proposta spiega in dettaglio come differisce dall'utilizzare i futures direttamente e perché questa sarebbe una buona idea. –

risposta

4

citare N3564:

Dopo sospensione, una funzione ripristinabile può essere ripreso dalla logica di programmazione del tempo di esecuzione e finirà per completare la sua logica, a quel punto esegue un'istruzione return (esplicita o implicita) e imposta il valore del risultato della funzione nel segnaposto.

Va notato che esiste un'asimmetria tra il comportamento osservato della funzione dall'esterno (chiamante) e l'interno: la prospettiva esterna è che la funzione restituisce un valore di tipo futuro al primo punto di sospensione, mentre l'interno prospettiva è che la funzione restituisce un valore di tipo T tramite un'istruzione return, le funzioni che restituiscono future/shared_future si comportano in modo ancora diverso.

Una funzione di riassunzione può continuare l'esecuzione su un altro thread dopo la ripresa in seguito a una sospensione della sua esecuzione.

Ciò significa in sostanza che

  • Quando viene chiamato prima, una funzione ripristinabile esegue nel contesto filo del che chiama.
  • Dopo ogni punto di sospensione, l'implementazione può scegliere liberamente su quale thread continuare l'esecuzione di una funzione riassumibile
  • Dal punto di vista del codice chiamante, una funzione di ripristino funziona come una funzione asincrona, dove parte del (osservabile)) il comportamento viene eseguito in modo affidabile al momento della restituzione della funzione, ma il risultato finale potrebbe non essere ancora presente (il valore restituito future<T> non deve essere in uno stato pronto).
  • Come programmatore, non è necessario saltare i telai per riprendere la funzione di ripresa.
+0

Vedere alcuni di essi in azione qui: http://blogs.msdn.com/b/vcblog/archive/2013/12 /20/asynchronous-programming-in-c-using-resumable-functions-and-await.aspx –

+0

e altro qui http://blogs.msdn.com/b/vcblog/archive/2014/11/12/resumable- funzioni-in-c.aspx –