I mutex pthread funzionano sui thread se nella memoria condivisa?

Ho trovato questo: metodo di sincronizzazione veloce dell’interprete

Ero solito credere che un mutex pthread potesse essere condiviso solo tra due thread nello stesso spazio di indirizzamento .

La domanda / risposte sembra implicare:

Se ho due proceses separati A e B. Hanno una regione di memoria condivisa M. Posso inserire un mutex pThread in M, bloccare A, bloccare B, sbloccare in A; e B non bloccherà più il mutex. È corretto? I mutex pThread possono essere condivisi in due processi separati?

Modifica: sto usando C ++, su MacOSX.

Devi dire al mutex di essere process-shared quando è stato inserito:

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

Nota in particolare, “Il valore predefinito dell’attributo è PTHREAD_PROCESS_PRIVATE”, il che significa che accedervi da processi diversi è un comportamento non definito.

Se la tua libreria C / pthread è conforms, dovresti essere in grado di dire se supporta i mutex condivisi tra più processi controllando se la macro di test delle funzionalità _POSIX_THREAD_PROCESS_SHARED è definita su un valore diverso da -1 o eseguendo una query sulla configurazione del sistema in fase di esecuzione utilizzando sysconf(_SC_THREAD_PROCESS_SHARED) se la macro di test delle funzioni non è definita .

EDIT : come ha sottolineato Steve , dovrai configurare in modo esplicito il mutex per la condivisione tra i processi assumendo che la piattaforma supporti tale funzione come descritto sopra.

Ero preoccupato che potesse esserci una condizione in cui un mutex nella memoria condivisa potrebbe non funzionare correttamente, così ho fatto qualche ricerca e ho trovato alcuni documenti che trattano il problema come un gioco da ragazzi:

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

Ulteriori scavi, tuttavia, hanno dimostrato che le versioni precedenti di glibc hanno sofferto problemi nei mutex della memoria condivisa: (Questo è un cambiamento antico, ma illustra il 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; } 

Senza ulteriori dettagli su quale implementazione di pthread stai usando, è difficile dire se sei sicuro o meno.

La mia preoccupazione è che molte implementazioni (e alcuni interi linguaggi, come perl, python e ruby) hanno un object di blocco globale che gestisce l’accesso agli oggetti condivisi. Quell’object non sarebbe condiviso tra i processi e quindi, mentre i tuoi mutex probabilmente funzionerebbero la maggior parte del tempo, potresti trovarti ad avere due processi contemporaneamente a manipolare il mutex allo stesso tempo.

So che questo vola di fronte alla definizione di un mutex ma è ansible:

Se due thread operano contemporaneamente in processi diversi, ciò implica che si trovano su core differenti. Entrambi acquisiscono il loro object di blocco globale e vanno a manipolare il mutex nella memoria condivisa. Se l’implementazione pthread forza l’aggiornamento del mutex attraverso le cache, entrambi i thread potrebbero finire per aggiornarsi contemporaneamente, entrambi pensano di tenere il mutex. Questo è solo un ansible vettore di errore che mi viene in mente. Ci potrebbe essere un numero qualsiasi di altri. Quali sono le caratteristiche specifiche della tua situazione: OS, versione di pthreads, ecc.?