Domanda

Ho notato che boost.asio ha un sacco di esempi che coinvolgono prese, porte seriali, e ogni sorta di esempi non-file. Google non ha davvero alzato molto per me che cita se ASIO è un approccio buono o valido per fare file di I / O asincrono.

Ho gobs dei dati mi piacerebbe scrivere su disco in modo asincrono. Questo può essere fatto con IO nativo sovrapposto in Windows (la mia piattaforma), ma preferirei avere una soluzione indipendente dalla piattaforma.

Sono curioso di sapere se

  1. boost.asio ha alcun tipo di supporto di file
  2. supporto di file boost.asio è abbastanza maturo per il file di tutti i giorni i / o
  3. archivierà sostegno mai essere aggiunto? Che cosa è la prospettiva per questo?
È stato utile?

Soluzione

ha boost.asio qualsiasi tipo di supporto per i file?

A partire da (credo) Boost 1.36 (che contiene Asio 1.2.0) è possibile usare [boost :: asio ::] finestre :: stream_handle o finestre :: random_access_handle per avvolgere un manico ed eseguire lettura asincrono e scrivere i metodi su di esso che usa la struttura OVERLAPPED internamente.

User Lazin menziona anche boost :: asio :: :: finestre random_access_handle che possono essere utilizzate per le operazioni asincrone (tubi per esempio con nome, ma anche i file).

è boost.asio supporto di file abbastanza maturo per il file di tutti i giorni I / O?

Come Boost.Asio in sé è ampiamente utilizzato da ora, e l'implementazione utilizza sovrapposta IO internamente, direi di sì.

archivierà sostegno mai essere aggiunto? Che cosa è la prospettiva per questo?

Come non c'è tabella di marcia si trova sul sito Asio , direi che non ci saranno nuove aggiunte alla Boost.Asio per questa funzione. Anche se c'è sempre la possibilità di collaboratori aggiungendo il codice e le classi a Boost.Asio. Forse si può anche contribuire le parti mancanti da soli! : -)

Altri suggerimenti

boost :: asio file di I / O su Linux

In Linux, utilizza il meccanismo ASIO epoll per rilevare se un socket / lima descrittore è pronto per la lettura / scrittura. Se si tenta di utilizzare ASIO vaniglia su un normale file su Linux si otterrà un "operazione non consentita" eccezione perché epoll non supporta i file regolari su Linux .

La soluzione consiste nel configurare ASIO per utilizzare il select meccanismo su Linux. È possibile farlo attraverso la definizione di BOOST_ASIO_DISABLE_EPOLL. Il trade-off qui essendo selezionare tende ad essere più lento di epoll se' re di lavoro con un grande numero di socket aperti. Aprire un file che utilizzano regolarmente open() e quindi passare il descrittore di file ad un boost::asio::posix::stream_descriptor .

boost :: asio file di I / O su Windows

In Windows è possibile utilizzare boost::asio::windows::object_handle per avvolgere una Handle che è stato creato da un'operazione di file. Vedere esempio .

ASIO supporta sovrapposta di I / O su Windows dove il sostegno è buono. Su Unix questa idea è rimasto fermo a causa di:

  • I file sono spesso trovano sullo stesso dispositivo fisico, accedervi sequenziale è preferibile.
  • le richieste di file spesso completano molto rapidamente perché sono fisicamente nelle vicinanze.
  • I file sono spesso fondamentali per completare il funzionamento di base di un programma (ad esempio la lettura nel file di configurazione deve essere fatto prima di inizializzare ulteriormente)

L'unica eccezione comune sta servendo i file direttamente ai socket. Questo è tale uno speciale-caso comune che Linux ha un funzione del kernel che gestisce questo per voi. Ancora una volta, negando la ragione per usare asincrona file di I / O.

In breve:. ASIO sembra riflettere la filosofia di progettazione del sistema operativo sottostante, I / O sovrapposto di essere ignorato dalla maggior parte degli sviluppatori Unix, quindi non è supportato su quella piattaforma

boost :: asio :: :: finestre random_access_handle è il modo più semplice per farlo, se avete bisogno di qualcosa avanzate, ad esempio LockFileEx asincrono o qualcosa d'altro, si potrebbe estendere ASIO, aggiungere i propri eventi asincroni. esempio

Linux ha una libreria ASIO che non è difficile da usare rispetto a Windows API per questo lavoro (ho usato). Entrambe le serie di sistemi operativi implementano la stessa architettura concettuale. Si differenziano per dettagli che sono rilevanti per scrivere una buona biblioteca, ma non fino al punto che non si può avere un'interfaccia comune per entrambe le piattaforme OS (ho usato uno).

In sostanza, tutte le versioni di file asincrone I / O seguire l'architettura "Fry Cook". Ecco quello che voglio dire nel contesto di una lettura op: I (thread di elaborazione) andare fino ad un contatore fast food (OS) e chiedere un cheeseburger (alcuni dati). Mi dà una copia del mio biglietto di ordine (un po 'di struttura dei dati) e le questioni di un biglietto nella parte posteriore per il cuoco (il Kernel e file system) per cucinare il mio hamburger. Ho poi andare sedersi o leggere il mio telefono (fare altri lavori). Più tardi, qualcuno annuncia che il mio hamburger è pronto (un segnale al thread di elaborazione) e ho raccogliere il mio cibo (buffer di lettura).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top