Pregunta

Pensé que usaría Boost.Interprocess's Message Queue en lugar de sockets para la comunicación dentro de un host. Pero después de profundizar en ella, parece que esta biblioteca, por alguna razón, evita la instalación de 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 para que no puedas adivinar esto de inmediato, pero parece ser el caso.

El inconveniente para mí es que la memoria compartida obtenida a través de shm_open (3) no parece ser utilizable con select (2) , a diferencia de las colas de mensajes POSIX obtenidas a través de mq_open (3) .

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

¿Fue útil?

Solución

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

En mi experiencia, la biblioteca Interprocess es bastante inmadura. Lo uso para la memoria compartida, y funciona bastante bien, pero hay algunos inconvenientes y he tenido que hackear algunas de las "características que faltan" como redimensionar dinámicamente la memoria compartida etc.

En resumen, no esperes que esta biblioteca sea una bala de plata todavía. Es bueno, pero no excepcional en este momento.

Otros consejos

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

Pero aquí hay otro lado (bueno) de este hecho: si su programa usa boost :: asio , puede ajustar la API de colas de mensajes POSIX como simplemente otro datagrama fuente de datos y esto (IMHO) sería incluso mejor de usar si fuera parte de boost :: interprocess ... sería bastante no trivial, pero (IMHO) definitivamente merece esto, por lo que puede trabajar con MQ de forma unificada y usar power de otras cosas de boost :: asio ...

... en mi próximo proyecto, si necesitaría POSIX MQ nuevamente, definitivamente tomaré este camino :)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top