c++ - programa - ¿Funciona mutexes pthread a través de subprocesos si en memoria compartida?
hilos en c (3)
Encontré esto: Método rápido de sincronización entre procesos.
Solía creer que un mutex pthread solo se puede compartir entre dos hilos en el mismo espacio de direcciones .
La pregunta / respuesta parece implicar:
Si tengo dos procesos A y B separados. Tienen una región de memoria compartida M. Puedo poner un mexexo pThread en M, bloquear en A, bloquear en B, desbloquear en A; y B ya no bloqueará en el mutex. ¿Es esto correcto? ¿Se pueden compartir las mutexes pThread en dos procesos separados?
Edición: Estoy usando C ++, en MacOSX.
Me preocupaba que pudiera haber una condición en la que un mutex en la memoria compartida no se comporte correctamente, por lo que hice algunas investigaciones y encontré algunos documentos que tratan el tema como una obviedad:
https://computing.llnl.gov/tutorials/pthreads/
Sin embargo, la investigación adicional demostró que las versiones anteriores de glibc sufrían problemas en las mutexes de memoria compartida: (Este es un cambio antiguo, pero ilustra el punto).
in linuxthreads/mutex.c
int __pthread_mutexattr_setpshared(...) {
/* For now it is not possible to shared a conditional variable. */
if (pshared != PTHREAD_PROCESS_PRIVATE)
return ENOSYS;
}
Sin más detalles sobre qué implementación de pthread está utilizando, es difícil decir si está seguro o no.
Mi causa de preocupación es que muchas implementaciones (y algunos lenguajes completos, como perl, python y ruby) tienen un objeto de bloqueo global que administra el acceso a los objetos compartidos. Ese objeto no se compartiría entre procesos y, por lo tanto, mientras que sus mutexs probablemente funcionen la mayor parte del tiempo, es posible que tenga dos procesos que manipulan simultáneamente el mutex al mismo tiempo.
Sé que esto va en contra de la definición de mutex, pero es posible:
Si dos subprocesos funcionan al mismo tiempo en diferentes procesos, esto implica que están en diferentes núcleos. Ambos adquieren su objeto de bloqueo global y van a manipular el mutex en la memoria compartida. Si la implementación pthread fuerza la actualización del mutex a través de los cachés, ambos hilos podrían terminar de actualizarse al mismo tiempo, ambos pensando que tienen el mutex. Este es solo un posible vector de falla que viene a la mente. Podría haber cualquier número de otros. ¿Cuáles son los aspectos específicos de su situación: sistema operativo, versión pthreads, etc.?
Necesitas decirle al mutex que se comparta con el proceso cuando esté inited:
http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html
En particular, tenga en cuenta que "el valor predeterminado del atributo es PTHREAD_PROCESS_PRIVATE", lo que significa que acceder a él desde diferentes procesos es un comportamiento indefinido.
Si su biblioteca C / pthread está de acuerdo, debería poder saber si admite mutex compartidos en varios procesos al verificar si la macro de prueba de características _POSIX_THREAD_PROCESS_SHARED
está definida con un valor distinto de -1
o al consultar la configuración del sistema en tiempo de ejecución usando sysconf(_SC_THREAD_PROCESS_SHARED)
si esa macro de prueba de características no está definida .
EDITAR : como Steve señaló , deberá configurar explícitamente la exclusión mutua para compartir los procesos, asumiendo que la plataforma sea compatible con esa característica, tal como lo describí anteriormente.