Interprocess mutex avec pthreads

Je veux utiliser un mutex qui sera utilisé pour synchroniser l’access à certaines variables résidant dans la mémoire partagée b / w deux processus différents. Comment puis-je y arriver. Exemple de code à effectuer qui sera très apprécié.

Utilisez plutôt un sémaphore POSIX initialisé à 1 . (Voir ci-dessous) Utilisez sem_init pour les sémaphores non nommés ou sem_open pour ceux nommés.

 sem_t sem; /* initialize using sem_init or sem_open */ sem_wait(&sem); /* critical region */ sem_post(&sem); 

Plusieurs années après la publication initiale de cette réponse, celle-ci doit être mise à jour.

Les mutex devraient en réalité être utilisés à la place des sémaphores . Les commentaires de R et kuga (copiés textuellement ci-dessous) expliquent pourquoi. En particulier, je trouve que la mention de Kuga selon laquelle les mutex ne peuvent être postés que par leur fil de locking est plus convaincante.


R

sem_init nécessite le partage d’un argument pshared différent de zéro, tout comme un mutex aurait besoin de l’atsortingbut pshared. Il n’y a aucune raison de préférer les sémaphores aux mutex, et en fait, les mutex seraient préférables, car vous pourriez utiliser un mutex robuste qui vous permet de gérer le cas (très réel!) Où un processus meurt en tenant le verrou.

kuga

En plus du message de R..`, un mutex ne peut être envoyé que par le fil de discussion qui le verrouille. Cela est souvent nécessaire et un sémaphore ne fournit pas cette fonctionnalité. Donc, ce n’est pas la bonne réponse, la réponse de Jeff doit être signalée comme étant la bonne réponse.

L’exemple suivant illustre la création, l’utilisation et la destruction d’un mutex interprocess Pthread. Généraliser l’exemple pour plusieurs processus rest un exercice pour le lecteur.

 #include  pthread_mutex_t shm_mutex; int main(void) { int err; pthread_mutexattr_t attr; err = pthread_mutexattr_init(&attr); if (err) return err; err = pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); if (err) return err; err = pthread_mutex_init(&shm_mutex, &attr); if (err) return err; err = pthread_mutexattr_destroy(&attr); if (err) return err; err = pthread_mutex_lock(&shm_mutex); if (err) return err; err = pthread_mutex_unlock(&shm_mutex); if (err) return err; err = pthread_mutex_destroy(&shm_mutex); if (err) return err; return 0; }