Aumentare la coda dei messaggi non basata sulla coda dei messaggi POSIX? Impossibile selezionare (2)?

StackOverflow https://stackoverflow.com/questions/408059

Domanda

Ho pensato di usare Coda messaggi al posto dei socket per la comunicazione all'interno di un host. Ma dopo averlo scavato, sembra che questa libreria per qualche motivo eviti la funzione di coda dei messaggi POSIX (che il mio sistema Linux supporta), e invece è implementata sulla memoria condivisa POSIX. L'interfaccia è abbastanza simile che potresti non indovinarlo subito, ma sembra essere il caso.

L'aspetto negativo per me è che la memoria condivisa ottenuta tramite shm_open (3) non sembra essere utilizzabile con select (2) , al contrario delle code di messaggi POSIX ottenute tramite mq_open (3) .

Sembra che la libreria di Boost perda in questo caso. Qualcuno capisce perché questo dovrebbe essere? Anche se le code dei messaggi POSIX sono disponibili solo su alcuni sistemi, mi aspetto che Boost utilizzi quella struttura dove è disponibile e la reimplementerà solo dove necessario. C'è qualche insidia nel sistema POSIX che non riconosco ancora?

È stato utile?

Soluzione

L'altro giorno mi sono imbattuto in una situazione simile durante l'utilizzo delle classi di sincronizzazione di Boost.Interprocess: vale a dire la classe condizione. È implementato in un "generico" ma il modo in cui è stato fatto è usare uno spinlock personalizzato che è altamente inefficiente (almeno su OS X). A tutti gli effetti ha reso inutili le classi di sincronizzazione.

Nella mia esperienza la libreria Interprocess è piuttosto immatura. Lo uso per la memoria condivisa, e funziona abbastanza bene ma ci sono alcuni spigoli e ho dovuto hackerare alcune funzioni "mancanti". come il ridimensionamento dinamico della memoria condivisa ecc.

In sintesi, non aspettarti che questa libreria sia ancora un proiettile d'argento. È buono, ma non eccezionale in questo momento.

Altri suggerimenti

Sì, sfortunatamente no. Sono stato anche deluso quando mi rendo conto che dopo aver scavato le fonti.

Ma qui c'è un altro (buono) lato di questo fatto: se il tuo programma utilizza boost :: asio , puoi racchiudere l'API delle code dei messaggi POSIX come solo un altro datagramma fonte di dati e questo (IMHO) sarebbe ancora meglio da usare se facesse parte di boost :: interprocess ... sarebbe abbastanza banale, ma (IMHO) merita sicuramente questo, quindi puoi lavorare con MQ in modo unificato e usare potenza di altre cose boost :: asio ...

... nel mio prossimo progetto se avessi di nuovo bisogno di POSIX MQ, prenderò sicuramente così :)

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