J’ai un projet de devoirs qui nécessite la création d’une bibliothèque STATIC pour fournir un access mutuel à quelques tuyaux nommés.
Ces canaux servent à la communication entre différents clients utilisant la bibliothèque et un serveur.
Maintenant, supposons que je veuille utiliser des mutex pthread; Comment puis-je y arriver? Comment les processus peuvent-ils savoir quelle est la zone de mémoire partagée dans laquelle le mutex est stocké? Et qui devrait avoir besoin de cette zone de mémoire? Le serveur ne peut pas, car la bibliothèque elle-même doit fournir une exclusion mutuelle.
Grâce à asveikau, j’ai trouvé ceci:
#define SHARED 1 #define MUTEX 1 int main() { sem_t* mutex = sem_open("mutex", O_CREAT); sem_init(mutex, SHARED, MUTEX); fork(), fork(), fork(); sem_wait(mutex); int i; for(i = 0; i < 10; i++) printf("process %d %d\n", getpid(), i), fflush(stdout); sem_post(mutex); }
que la sortie semble vraiment résoudre mon problème.
Merci tout le monde.
Je note cela comme un commentaire, mais cela mérite une réponse, je pense.
Comme d’autres le disent, les mutex pthread ne sont pas des processus croisés. Ce dont vous avez besoin est un “mutex nommé”. Vous pouvez utiliser sem_open
pour créer un sémaphore sem_open
et lui atsortingbuer un nombre initial de 1. Dans ce cas, sem_wait
devient “verrou mutex” et sem_post
devient “mutex unlock”.
Notez que sem_open
, bien que faisant partie de POSIX, n’est pas universellement pris en charge. Je pense que cela fonctionne sous Linux et Mac OS X. Probablement Solaris si vous vous en souciez (ces jours-ci, probablement plus). Je sais ENOSYS
OpenBSD, il échoue toujours avec ENOSYS
. YMMV.