Esperienze con C ++ Async / modello di attore Biblioteca [chiuso]

1

Sono abbastanza esperto in programmazione asincrona e simultanea in c # usando pattern di eventi, attori e attività, ma ora ho un compito in c ++ con cui ho familiarità di base e ha bisogno di asincronicità e concorrenza. Ho un regno libero nel decidere come farlo, e non ho l'esperienza c ++ necessaria per reinventare la ruota. Quindi, dopo aver consultato Google, vedo diverse librerie e framework per aggiungere questo, ma poche discussioni indipendenti su di loro, così gli utenti di Stack Exchange, quali esperienze hai avuto con le librerie asincrone in c ++? Non sto chiedendo quale sia il migliore o addirittura quale dovrei usare, ma più ne hai usato uno o più, pro e contro come hai visto, ecc., Praticamente quale è la tua recensione informale?

Ogni libreria del mondo utilizza gli stessi descrittori, quindi i siti Web ufficiali sono stati consultati, ma aiutano solo così tanto, e sembrano offrire tutte le stesse funzionalità di base di cui ho bisogno (concorrenza tra domini chiari, rendimento dei thread efficiente / continuazione , evento basato sul messaggio, disponibilità del metodo thread-safe). Quindi, tutte le cose sono più o meno uguali, sto giocando il pericoloso gioco della pesca per l'opinione degli sviluppatori. Quindi pensieri? Grazie mille.

Mentre sento che questa domanda colpisce al minimo 4 delle linee guida soggettive (non il divertimento spensierato, che richiede esperienze sulle opinioni, alla ricerca di risposte più lunghe che se non l'esperienza puramente personale dovrebbe essere supportata da riferimento). Ho sbagliato a fare questa domanda qui, quando ho postato questo ho pensato che il problema con le richieste soggettive è che il più delle volte vengono trattate come risposte obiettive, che non era il mio obiettivo. Il vero problema è che è impossibile chiedere opinioni generali e avere una risposta vera, non è questa la sede per iniziare una discussione sulle impressioni personali sugli strumenti utilizzati dal target demografico. Per essere chiari, tutte le librerie che ritengo pretendono di risolvere gli stessi problemi, quindi piuttosto che essere specifici del problema, stavo cercando di confrontare le opinioni soggettive. So che non esiste un obiettivo "migliore", la mia speranza era per qualcosa di simile a: lib a fornito più opzioni di b, ma preferisco le convenzioni di denominazione di b. Questo è stato un mio errore. La risposta data e contrassegnata come tale può essere utile per le persone, grandi punti generali da tenere a mente sulla concorrenza. Grazie a tutti per la vostra partecipazione.

    
posta kcar 13.03.2015 - 03:28
fonte

1 risposta

1

(Disclaimer: ho solo esperienza nella parallelizzazione dei carichi di lavoro computazionali. Non ho esperienza nell'I / O asincrono. Le opinioni qui riportate si basano semplicemente sulla lettura di articoli online, blog e Q & A siti web.)

L'applicazione della concorrenza a un progetto C ++ è più o meno un rigoroso esercizio di gestione del rischio di ingegneria del software. Devi scegliere strategie basate sul tuo livello di rischio accettabile; devi mantenere aperte le tue opzioni in modo che se la strategia attuale finisce in un vicolo cieco, puoi passare a un'altra strategia senza perdere una quantità significativa di lavoro completato; devi cercare e prototipare un po 'oltre l'attuale programma di implementazione per tenerti ben informato; evita le mode più recenti e non ancora provate, ecc.

Alcuni rischi specifici della concorrenza:

  • Qualsiasi dipendenza di terze parti non progettata specificamente per essere utilizzabile in ambienti con più thread sarà un ulteriore rischio.
  • Qualsiasi dipendenza closed-source il cui fornitore non abbia completamente impegnato il supporto dei propri utenti in un ambiente multi-thread costituirà un rischio aggiuntivo e di solito non ha altre attenuazioni oltre al passaggio a un'alternativa.
    • In primo luogo, se non è progettato per uno standard elevato di sicurezza del thread, in genere non può essere considerato affidabile in un ambiente con più thread.
    • "Completamente impegnati a supportare" significa che sono disposti a fare lo sforzo extra di investigare sporadiche condizioni di gara per conto tuo purché tu possa fornire una prova di concetto che (sporadicamente) riproduca le condizioni della gara. Questo presuppone che tu stia già utilizzando correttamente la libreria.
  • I carichi di lavoro computazionali sono relativamente più facili da parallelizzare rispetto ai carichi di lavoro di I / O (latenza).
  • Se il carico di lavoro è basato sulla rete e / o su disco, è possibile ridurre il rischio utilizzando l'I / O asincrono esistente fornito nativamente dal sistema operativo o librerie come boost :: asio.
    • Se questo è il tuo caso, affrontare l'I / O asincrono sarebbe il tuo primo passo verso il successo.
    • Questo significa che devi tollerare la proliferazione dei callback. Fai trading tediosità (mancanza di espressività, più manutenzione del codice in eccesso, più documentazioni) per ridurre il rischio (di usare un approccio provato e vero).
  • Coroutine basata su libreria C ++ è un approccio un po 'ad alto rischio.
    • In pratica stai giocando di prestigio prima dei sistemi operativi.
    • L'implementazione C ++ di C ++ è legata a specifiche versioni del sistema operativo (per esempio, almeno su Windows). Le nuove versioni del sistema operativo possono implementare nuove funzionalità a livello di processo che interrompono il codice C ++ precompilato collegato a una versione obsoleta di Coroutine.
  • Se si utilizza la libreria di threading, valutare attentamente se la libreria ha la piena benedizione del fornitore del sistema operativo.
    • Questo in genere significa Intel TBB per sistemi x86 basati su Linux, Microsoft PPL per Windows x86 (desktop e server), ecc.
  • Non mettere troppa speranza su "proiettili d'argento" che pretendono di minimizzare le modifiche necessarie al codice legacy. In genere, l'applicazione della concorrenza implica modifiche massicce al codice legacy.
  • Se la tua applicazione è anche legata alla memoria, prova a vedere se riesci a mitigarla semplicemente acquistando sempre più RAM (e che i tuoi pagatori di banconote facciano lo stesso). Altrimenti, i problemi legati alla memoria possono essere difficili da risolvere oltre alla concorrenza.
risposta data 13.03.2015 - 06:17
fonte