9
votes

Comment modifier le comportement de verrouillage récursif de Windows MuTex?

Windows Mutex semble autoriser une serrure acquise à acquérir à nouveau (récursivement) si le fil possédant actuellement le verrou essaie de l'acquérir.

Mais, les serrures Pthread basées sur POSIX ne permettent pas un tel comportement.

Y a-t-il une macro de compilation de la compilation ou des paramètres pouvant rendre le comportement Windows Mutex de la même manière que le mutex Pthread?


0 commentaires

4 Réponses :



9
votes

Tant que vous programmez sous Windows, évitez de réimplémenter le comportement de son mutex. Il est en cours de ré-entrant par le même thread est absolument essentiel pour son comportement défini.

Un objet de synchronisation sans fil affinité est un sémaphore qui compte pour 1. utiliser CreateSemaphore ().

FWIW, il est très curieux que vous ayez besoin de ce type de comportement. On dirait que vous essayez d'utiliser le même objet de synchronisation dans plusieurs endroits de manière inappropriée. Vous pouvez utiliser le sémaphore mais vous perdrez un potentiel de concurrence. Envisager d'utiliser plus d'un mutex à la place.


3 commentaires

En fait, j'ai ce problème lié au code de ventilation et je tiens à le résoudre sans changer une grande partie de la logique. Donc, voulait savoir si le comportement peut être modifié. Mon code devrait fonctionner dans plusieurs OS, donc je souhaite que le comportement reste identique à tous les systèmes d'exploitation. "On dirait que vous essayez d'utiliser le même objet de synchronisation dans plusieurs endroits de manière inappropriée." - Oui. C'est un cas de scénario négatif. Je veux juste que le comportement soit identique dans tous les systèmes d'exploitation dans le scénario négatif. Merci pour votre réponse!


Eh bien, utilisez un sémaphore de boost. Multi-plate-forme et non reentrante.


Vous voudrez peut-être utiliser Mutex non récursif pour synchroniser des tâches (par exemple pour mettre en œuvre une barrière entre N tâches). En ajout, il y a une tonne de raisons de considérer le mutex récursif nocif et évitez.



11
votes

Vous ne pouvez pas modifier le fait que Windows Muticètres sont récursifs. Et tandis que les threads POSIX ne sont pas récursifs par défaut, vous pouvez utiliser utiliser pthread_mutexattr_sedtype () avec le drapeau pthread_mutex_recursive pour en faire un.

Le verrouillage d'un mutex dans Windows est en fait une opération très coûteuse et la mieux adaptée à la synchronisation inter-traiter. Pour un mutex utilisé uniquement dans un seul processus, une section critique est normalement utilisée, mais elles sont également ré-entrantes. Comme les États de Nobugz, vous auriez besoin d'utiliser un sémaphore, initialisé avec un nombre maximum de 1, pour obtenir une synchronisation non récursive.

Un objet de sémaphore est comme un compteur spécial, qui peut être incrémenté atomiquement et décrémenté à travers les threads (ou les processus éventuellement partagés). En créant un avec un nombre maximum de 1, vous obtenez le comportement non récursif requis.


2 commentaires

La section critique peut être saisie à nouveau du même thread. MSDN.MicRosoft.com/en-us/Library/ms682608 (Vs.85) .aspx


Merci d'avoir attrapé cette oops - réponses fixes en conséquence.



2
votes

Je suggère d'utiliser Lecture / écriture Serrures (AKA SRW) . Comme Windows Mutex, ils ne sont pas récursifs. Comme des sections critiques, ils sont légers et n'appellent pas le noyau s'ils sont libres ( Benchmarks < / a>).


0 commentaires