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.?
domanda correlata OP: http://stackoverflow.com/questions/2389307/on-macosx-in-c-how-to-do-interprocess-communication-over-shared-memory-withou – Void