2010-03-05 9 views
18

ho trovato questo: Fast interprocess synchronization methodI mutex pthread funzionano sui thread se nella memoria condivisa?

Credevo che un mutex pthread può essere condiviso tra due thread nello stesso spazio di indirizzi .

Le domande/risposte ci sembra implicare:

Se ho due proceses separati Una & B. Hanno una regione di memoria condivisa M. posso mettere un mutex pThread in M, blocco in A, bloccare B, sblocca 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.

+0

domanda correlata OP: http://stackoverflow.com/questions/2389307/on-macosx-in-c-how-to-do-interprocess-communication-over-shared-memory-withou – Void

risposta

1

ero preoccupato che ci potrebbe essere una condizione in cui un mutex nella memoria condivisa potrebbe non riuscire a comportarsi correttamente, così ho fatto qualche ricerca e si avvicinò con alcuni documenti che trattano il problema come un gioco da ragazzi:

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

Inoltre scavo, tuttavia, ha dimostrato che le vecchie versioni di glibc hanno sofferto problemi di mutex di memoria condivisa: (Questo è un antico cambiamento, 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 oggetto di blocco globale che gestisce l'accesso agli oggetti condivisi. Quell'oggetto 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 vola di fronte della definizione di un mutex ma è possibile:

Se due fili operano contemporaneamente in diversi processi, essa implica che essi sono diversi nuclei. Entrambi acquisiscono il loro oggetto 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 possibile 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.?

+0

Il tuo collegamento è standard pThread documentazione. Come rende il problema un gioco da ragazzi? – anon

5

Se il vostro C/libreria pthread è conforme, si dovrebbe essere in grado di dire se supporta i mutex condivisi attraverso processi più verificando se la macro di prova _POSIX_THREAD_PROCESS_SHARED funzione è definita per un valore diverso da -1 o interrogando la configurazione del sistema in runtime utilizzando sysconf(_SC_THREAD_PROCESS_SHARED) se la macro di test delle funzioni è non definita.

EDIT: Come Steve pointed out, è necessario configurare esplicitamente il mutex per la condivisione attraverso i processi assumendo la piattaforma supporta tale funzionalità, come ho descritto sopra.

+0

Si noti che le implementazioni del sistema operativo possono a volte definire '_POSIX_THREAD_PROCESS_SHARED' per essere positive ma in realtà non implementarle (perché POSIX dice che è opzionale). Vedi https://github.com/boostorg/interprocess/blob/4f8459e868617f88ff105633a9aa82221d5e9bb1/include/boost/interprocess/detail/workaround.hpp#L45 per capire come l'amplificazione fa fronte a questo. – Anon

13

è necessario indicare il mutex di essere processo condiviso quando è Inited:

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 l'accesso da diversi processi è un comportamento indefinito.

+1

+1. Ho dimenticato di indicarlo nella mia risposta. :) – Void

+0

Il collegamento alla versione corrente: http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_mutexattr_setpshared.html – alk