Lettura usando IO non bloccante su un file system in modo asincrono in C ++ (passando da Node.js)

2

Sto provando a cambiare il mio cervello dalla programmazione iOS Node.js / Objective-C alla programmazione C ++, ed è un po 'oneroso. Node.js e Objective-C con iOS non hanno un ciclo di esecuzione che dovrei gestire. Quindi, per favore, aiuta anche a piegare la mia mente ai diversi concetti.

Sto creando un programma EAGI per Asterisk ( link ) che riceve i comandi da Asterisco STDIN, invia comandi indietro con STDOUT, e allo stesso tempo riceve dati audio PCM grezzi su FD 3 (STDERR + 1).

Inizialmente, il programma scarterà tutti i dati ricevuti da FD 3, finché non sarà pronto per la registrazione. Quando è pronto per ricevere l'audio non elaborato, inizierà a ricevere i dati ricevuti su FD 3, a codificarlo e a inviarlo su un socket di dati.

In Node.js potremmo semplicemente reindirizzare tutti i dati da fd 3 a qualcosa e ciò accadrebbe "in modo asincrono" e non interferirebbe con l'elaborazione dei dati STDIN allo stesso tempo.

Quando ci si sposta in C ++, qual è il metodo che dovrei usare per leggere da FD 3 mentre si è in grado di elaborare STDIN e questo è tutto fatto nel ciclo di esecuzione principale? E il codice IO non bloccante causerà il picco del processore del sistema per tutta la durata del runtime del programma, e dovrei provare a utilizzare thread invece di?

    
posta Mikey A. Leonetti 15.07.2015 - 16:41
fonte

2 risposte

2

Utilizzerai una libreria IO asincrona (o userai la posix nitty grossa o l'API win32 tu stesso se sei masochista) e userai questo per creare un ciclo di dispatcher.

Ad esempio in libreria di asso Boost creerebbe un boost::asio::io_service per aprire gli stream e avviare async_read con un gestore che farà ciò che vuoi e chiamerà run su io_service che avvierà il ciclo del dispatcher.

    
risposta data 15.07.2015 - 17:14
fonte
1

Tu (e node.js) non puoi leggere da 2 flussi contemporaneamente su un singolo thread. Dovrai alternare le letture mentre i dati vengono ricevuti o letti da entrambi i thread differenti.

Potresti usare beginthread () per avviare una funzione in un thread e leggere da lì. Usa setbuf () per reindirizzare l'FD su un buffer del tuo programma che puoi usare per leggere usando le routine IO del file standard.

... oppure puoi semplicemente usare Boost :: IOStreams o Boost :: asio e lascia la libreria fai tutto il lavoro duro per te.

    
risposta data 15.07.2015 - 17:08
fonte

Leggi altre domande sui tag