¿Los subprocesos pthread funcionan a través de subprocesos si están en la memoria compartida?

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 / respuestas allí parece implicar:

Si tengo dos procesos separados A y B. Tienen una región de memoria compartida M. Puedo poner un mutex de pThread en M, bloquear en A, bloquear en B, desbloquear en A; y B ya no bloqueará en el mutex. ¿Es esto correcto? ¿Pueden pThread mutexes ser compartidos en dos procesos separados?

Editar: estoy usando C ++, en MacOSX.

Debe indicarle a la exclusión mutua que se compartirá el proceso cuando está inited:

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_mutexattr_setpshared.html

Tenga en cuenta en particular, “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 es conforme, debería poder determinar si admite mutex compartidos en varios procesos comprobando si la macro de prueba de la función _POSIX_THREAD_PROCESS_SHARED se define con un valor distinto de -1 o consultando la configuración del sistema en tiempo de ejecución usando sysconf(_SC_THREAD_PROCESS_SHARED) si esa macro de prueba de característica no está definida .

EDITAR : Como señaló Steve , tendrá que configurar explícitamente el mutex para compartir en todos los procesos, suponiendo que la plataforma admita esa función como describí anteriormente.

Me preocupaba que pudiera haber una condición en la que un mutex en la memoria compartida pudiera no funcionar correctamente, así que investigué y obtuve algunos documentos que tratan el tema como una obviedad:

https://computing.llnl.gov/tutorials/pthreads/

Sin embargo, la excavación adicional mostró que las versiones anteriores de glibc sufrían problemas en 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 motivo de preocupación es que muchas implementaciones (y algunos lenguajes completos, como perl, python y ruby) tienen un objeto de locking global que administra el acceso a los objetos compartidos. Ese objeto no se compartiría entre procesos y, por lo tanto, mientras que sus mutexes probablemente funcionarían la mayor parte del tiempo, es posible que tenga dos procesos manipulando simultáneamente el mutex al mismo tiempo.

Sé que esto va en contra de la definición de mutex, pero es posible:

Si dos hilos están operando al mismo tiempo en diferentes procesos, implica que están en diferentes núcleos. Ambos adquieren su objeto de locking 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 las cachés, ambos hilos podrían terminar actualizándose al mismo tiempo, ambos pensando que tienen el mutex. Esto es solo un posible vector de falla que viene a la mente. Podría haber cualquier cantidad de otros. ¿Cuáles son los detalles de su situación: sistema operativo, versión pthreads, etc.?