Mettre un mutex dans un fichier mappé en mémoire sur Windows en C / C ++

Windows offre-t-il un mutex pouvant être placé dans un fichier mappé en mémoire et utilisé dans plusieurs processus?

Idéalement, il doit être complètement autonome afin de pouvoir survivre seul dans le fichier, même après un redémarrage. En outre, aucune ressource ne doit être divulguée si je supprime simplement le fichier manuellement alors qu’aucun processus n’est en cours d’exécution.

Si possible, la solution devrait également proposer le concept «conditionnel» associé, qui devrait également être un object pouvant s’asseoir dans un fichier mappé en mémoire partagée.

En bref, j’ai besoin de quelque chose de similaire à un mutex PTHREADS avec l’atsortingbut SHARED.

Pour autant que je sache, l’utilisation d’un mutex PTHREADS n’est pas possible car l’atsortingbut SHARED n’est pas pris en charge dans le port Windows de PTHREADS.

Pour partager un object de synchronisation, atsortingbuez-lui un nom et utilisez le même nom dans chaque processus lorsque vous créez l’object.

Les objects de synchronisation suivants peuvent être partagés entre processus de cette manière:

  • Mutex
  • Sémaphore
  • un événement

Les sections critiques ne peuvent pas être partagées, mais sont plus rapides.

Tester ou attendre sur ces objects est fait avec la famille de fonctions wait, souvent WaitForMultipleObjects .

Utilisez le fichier comme son propre mutex: utilisez la fonction LockFileEx et LockFileEx tout le monde de verrouiller l’octet 0 du fichier lorsqu’il souhaite revendiquer le mutex.

Ce n’est pas possible. L’object mutex lui-même vit dans l’espace du kernel pour le protéger du code utilisateur en déroute avec son état. Le descripteur que vous lui avez acquis n’est valide que pour le processus qui l’a acquis. Techniquement, vous pouvez utiliser DuplicateHandle () et placer le handle renvoyé dans le fichier mmf, mais uniquement si vous avez un handle vers l’autre processus qui accède à la section mémoire. C’est assez fragile.

C’est pourquoi vous pouvez spécifier un nom pour le mutex dans la fonction CreateMutex (). L’autre processus y parvient en utilisant le même nom dans l’appel OpenMutex.