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. P>
Mais, les serrures Pthread basées sur POSIX ne permettent pas un tel comportement. P>
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? P>
4 Réponses :
Regardez cet article sous 'Fast Mutex' a>. p>
Ces types de mutex ne peuvent pas être acquis de manière récursive. p>
Off Bien sûr, vous devez examiner comment les implémenter en c. P>
Le support Mutex rapide est destiné aux pilotes, pas de code de mode utilisateur.
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. P>
Un objet de synchronisation sans fil affinité est un sémaphore qui compte pour 1. utiliser CreateSemaphore (). P>
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. P>
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.
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 em> utiliser 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. P>
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. P>
pthread_mutexattr_sedtype () code>
avec le drapeau code> pthread_mutex_recursive code> pour en faire un. p>
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.
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>). p>