2009-01-02 22 views
7

Pensé que usaría Boost.Interprocess Message Queue en lugar de sockets para la comunicación dentro de un host. Pero después de investigarlo, parece que esta biblioteca, por alguna razón, evita la cola de mensajes POSIX (que es compatible con mi sistema Linux) y, en su lugar, se implementa sobre la memoria compartida POSIX. La interfaz es lo suficientemente similar como para que no adivine esto de inmediato, pero parece ser el caso.Boost Message Queue no está basado en cola de mensajes POSIX? Imposible seleccionar (2)?

El inconveniente para mí es que la memoria compartida obtenido a través de shm_open(3) no parece ser utilizable con select(2), en contraposición a las colas de mensajes POSIX obtenidos a través de mq_open(3).

Parece que la biblioteca de Boost pierde en este caso. ¿Alguien sabe por qué debería ser esto? Incluso si las colas de mensajes POSIX solo están disponibles en algunos sistemas, espero que Boost use esa instalación donde esté disponible, y la vuelva a implementar solo cuando sea necesario. ¿Hay alguna trampa del sistema POSIX que aún no reconozco?

Respuesta

4

Me encontré con una situación similar el otro día al usar Boost.Interprocess 'clases de sincronización: es decir, la clase de condición. Se implementa de una manera "genérica", pero la forma en que se ha hecho es utilizar un spinlock personalizado que es altamente ineficiente (al menos en OS X). Para todos los efectos, hizo que las clases de sincronización fueran inútiles.

En mi experiencia, la biblioteca de Interprocess es bastante inmadura. Lo uso para memoria compartida, y funciona bastante bien, pero hay algunas asperezas y he tenido que hackear algunas "características faltantes" como cambiar el tamaño de la memoria compartida, etc.

En resumen, no lo haga Esperamos que esta biblioteca sea una bala de plata por el momento. Está bien, pero no es excepcional en este momento.

+0

Tenga en cuenta que en Linux, en lugar de utilizar un spinlock personalizado, utiliza los mutex compartidos y las variables de condición, que deberían ser casi tan eficaces como los mutex dentro del mismo proceso. Sin embargo, para seleccionar en los objetos 'boost :: interprocess', necesitará tener un subproceso que controle el objeto en cuestión y activar un fifo o eventfd cuando haya algunos datos en espera. – bdonlan

+0

Aún así, no hay ninguna explicación en cuanto a WHY boost :: interprocess no usa posix mqueue cuando está disponible ... Hice una abstracción de mqueue que al construir en win32, mi abstracción usa boost :: interprocess :: mqueue y cuando se construye en Linux, mi abstracción usa posix mqueue. Eso fue fácil, es por eso que no puedo encontrar una razón por la cual boost :: interprocess no haga lo mismo. ¿Inmadurez? Algo que supervisé? –

1

Sí, lamentablemente no es así. También me decepcionó cuando me di cuenta de que después de cavar las fuentes.

Pero aquí es otro lado (buena) de este hecho: si su programa utiliza boost::asio, puede envolver mensaje POSIX colas API como sólo otro datagrama fuente de datos y esto (en mi humilde opinión) sería aún mejor usar si fuera una parte de boost::interprocess ... no sería trivial, pero (en mi humilde opinión) definitivamente se lo merece, así que puede trabajar con MQ de forma unificada y usar potencia de otras boost::asio cosas ...

... en mi próximo proyecto si necesitaría POSIX MQ de nuevo, definitivamente tomaré esta forma :)

+0

Tuve la misma idea sobre el uso de boost :: asio para la cola de mensajes, exactamente como usted propone, como otra fuente de datagrama. ¿Tuviste alguna experiencia al agregar una fuente de datagramas para impulsar :: asio? Apenas he arañado la superficie del tema leyendo algún código fuente de boost, pero todavía tengo que encontrar un buen docu/tutorial sobre el tema ... –

Cuestiones relacionadas