2014-11-19 25 views
12

Sto leggendo http://olk.github.io/libs/fiber/doc/html/ Mi sembra che con Boost.Fiber il C++ si stia avvicinando alla capacità di Erlang di avere migliaia di "processi", noti anche come "processi verdi [discussioni]" http://en.wikipedia.org/wiki/Green_threads.Con Boost.Fiber C++ si avvicina di un passo al processo/thread in stile Erlang?

La mia domanda è, Boost.Fiber è pronto per la produzione, ci sono ora alternative C++ con documentazione ed esempi migliori? Qualcuno ha menzionato i thread leggeri, ma non riesco a trovare un riferimento. Un'ultima domanda è: perché lo standard C++ non include le fibre?

La ragione per cui sono interessato a questo è perché ho aggiornamenti in tempo reale in cui un cambiamento di valore può avere un impatto (generare) centinaia/migliaia di piccoli ma imbarazzanti calcoli paralleli. Il modello di thread C++ non funziona molto bene, imo. Si prega di no GPU, dal momento che richiede troppo tempo per trasferire le informazioni da e verso la GPU.

Mi rendo conto che Erlang è molto più di questo quindi per favore non educarmi su Erlang vs C++ nel caso generale.

+0

In realtà questo è un problema con la pianificazione e il cambio di contesto: http://www.linuxplumbersconf.org/2013/ocw//system/presentations/1653/original/LPC%20-%20User%20Threading.pdf – Ivan

risposta

13

Boost.Fiber è stato esaminato dalla comunità Boost nel gennaio 2014 ed è stato trovato necessario un lavoro aggiuntivo significativo. Visualizza i risultati della revisione della community allo http://lists.boost.org/boost-announce/2014/01/0393.php.

C++ 17 cerca anche di ottenere un WinRT come M: N modello di thread basato su funzioni di ripristino utilizzando la parola chiave di attesa proposta. Microsoft ha implementato il supporto nel proprio compilatore e, a parte i trucchi magici per l'allocazione della memoria per i futures, sembra molto promettente. Il documento N pertinente è N4134 (http://www.open-std.org/Jtc1/sc22/wg21/docs/papers/2014/n4134.pdf) e, come si vedrà, se accettato, questa formulazione di funzioni riassuntive fornirebbe effettivamente la scalabilità di tipo Erlang anche se la sintassi è un po 'ottusa (ehi, è C++, quando la sua sintassi è sempre diretta !).

Naturalmente, se avete bisogno di una soluzione portatile ora, o andare via stackless coroutine con ASIO (attenzione: è fragile), o finemente gestori di grano ASIO con fili ASIO utilizzando un'istanza di classe come il vostro stato di esecuzione, che è più o meno la stessa cosa, altrimenti usa comunque Boost.Fiber. Se avete solo bisogno di Windows, mi piacerebbe portare avanti con estensioni proprietarie di Microsoft me stesso, sono altamente a differenza di abbandonarli a meno che non abbandonano WinRT :)

Edit: L'autore di Boost.Fiber mi dice che a partire da gennaio 2015 le modifiche consigliate dalla revisione della community sono complete e, a parte i miglioramenti della documentazione, Fibra è considerata pronta per l'inclusione nel Boost ufficiale. Se questo è davvero il caso, allora Fiber è probabilmente la soluzione migliore prima che il supporto di linguaggio C++ 17 ufficiale per le funzioni di riassunzione finale compaia nei compilatori.

+0

Grazie. Questo è in realtà utile e interessante. Una cosa che ho notato è che il primo C++ 14/17 deve prima implementare la nozione di parallelismo per implementare queste nozioni. Quindi std :: await ha senso senza std :: thread, o std :: threadpool? – Ivan

+0

@Ivan: Hai praticamente centrato la testa sul comitato che decide su quale modello di parallelismo usare. Direi che sono attualmente divisi su questo, con Hartmut (tramite HPX) e Microsoft tramite WinRT che prendono un modello di threading M: N in cui M è thread del kernel e N è coroutine. Inoltre, solo perché il gruppo di studio di Concurrency ha un'opinione non significa che persuaderà il comitato necessariamente, anche se se diciamo che clang e MSVC implementano entrambi il supporto del compilatore sperimentale direi che sigillerebbero la discussione. –

+0

@Ivan: per quanto riguarda l'attesa (non std :: await, attendere sarà una parola chiave) che richiede std :: thread, il piano corrente è che esiste un concetto di futuro e di thread (ricorda i concetti in C++ 17), e se un tipo si dichiara come implementante il concetto, quindi in teoria il compilatore lo accetterà. Quindi boost :: thread dovrebbe funzionare con await così come std :: thread, simile per boost :: future vs std :: future. –