2012-02-13 14 views
5

Actualmente, tengo 2 procesos que se comunican usando el impulso de formulario message_queue y shared_memory. Todo funciona como se atiende.¿El boost :: interprocess threadsafe?

Ahora necesito hacer uno de estos procesos con múltiples hilos (gracias a boost de nuevo), y me preguntaba si necesito usar un mecanismo de protección entre los hilos (como mutex), o si la biblioteca boost :: interprocess ya proporciona un mecanismo de protección?

No encontré ninguna información sobre eso en la documentación de impulso. Por cierto, estoy usando boost 1.40.

Gracias de antemano.

+0

¿Has leído http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html? –

Respuesta

2

Los recursos compartidos de impulso :: entre procesos (memoria compartida, etc.) requieren que se proporcione la sincronización necesaria. La razón de esto es que no se requiere sincronización, y por lo general es una operación un tanto costosa en cuanto al rendimiento.

Digamos, por ejemplo, que tiene un proceso que escribió en la memoria compartida las estadísticas actuales de algo en formato entero de 32 bits, y algunos procesos que leen esos valores. Dado que los valores son enteros (y, por lo tanto, en su plataforma las lecturas y escrituras son atómicas) y tiene un solo proceso que las escribe y algunos procesos las leen, no se necesita sincronización para este diseño.

Sin embargo, en algunos ejemplos necesitará la sincronización, como si el ejemplo anterior tuviera varios escritores, o si en lugar de números enteros estuviese utilizando datos de cadena. Hay varios mecanismos de sincronización en el interior de impulso (así como los no-boost, pero desde el que ya utilizan impulso), describen a continuación:

[Refuerzo información para la versión estable: 1,48] http://www.boost.org/doc/libs/1_48_0/doc/html/interprocess/synchronization_mechanisms.html

[Boost información para la versión de su usando: 1.40] http://www.boost.org/doc/libs/1_40_0/doc/html/interprocess/synchronization_mechanisms.html

con memoria compartida es una práctica común colocar el mecanismo de sincronización en la base del segmento de memoria compartida, donde puede ser anónima (es decir, el núcleo del sistema operativo no proporciona acceso a por su nombre). De esta manera, todos los procesos saben cómo bloquear el segmento de memoria compartida, y puede asociar bloqueos con sus segmentos (si tiene varios, por ejemplo)

Recuerde que un mutex requiere el mismo hilo de ejecución (dentro de un proceso) para desbloquearlo que lo bloqueó. Si necesita bloquear y desbloquear un objeto de sincronización desde diferentes subprocesos de ejecución, necesita un semáforo.

Asegúrese de que si elige utilizar un mutex que es un muxto entre procesos (http://www.boost.org/doc/libs/1_48_0/doc/html/boost/interprocess/interprocess_mutex.html) a diferencia del mutex en la biblioteca de subprocesos de subprocesos que es para un solo proceso con múltiples subprocesos.

+0

+1 por "Como los valores son enteros (y por lo tanto en su plataforma las lecturas y escrituras son atómicas) y tiene un solo proceso para escribirlas y algunos procesos las leen, no se necesita sincronización para este diseño". – FaceBro

Cuestiones relacionadas