select boost message-queue interprocess epoll

select - Boost Message Queue no está basado en cola de mensajes POSIX? Imposible seleccionar(2)?



message-queue interprocess (2)

El otro día me encontré con una situación similar cuando uso las clases de sincronización de Boost.Interprocess: concretamente la clase de condición. Se implementa de una manera "genérica", pero la forma en que se ha hecho es usar 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 que faltan", como cambiar el tamaño de la memoria compartida, etc.

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

Pensé que usaría Message Queue de Boost.Interprocess 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 en la parte superior de la memoria compartida de POSIX. La interfaz es lo suficientemente similar como para que no adivine esto de inmediato, pero parece ser el caso.

La desventaja 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 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?


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

Pero este es otro aspecto (bueno) de este hecho: si su programa usa boost::asio , puede ajustar las colas de mensajes POSIX API como solo otra fuente de datos de datagramas y esto (en mi humilde opinión) sería incluso mejor si fuera una parte de boost::interprocess ... sería bastante trivial, pero (en mi humilde opinión) definitivamente se lo merece, así que puedes trabajar con MQ de forma unificada y usar el poder de otras cosas de boost::asio ...

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