Comment modifier le comportement de locking récursif de Windows Mutex?

Windows Mutex semble permettre à un verrou acquis d’être à nouveau acquis (de manière récursive) si le thread propriétaire du verrou tente de l’acquérir.

Mais, les verrous Pthread basés sur Posix ne permettent pas un tel comportement.

Existe-t-il une macro de compilation ou des parameters permettant de faire en sorte que Windows Mutex se comporte de la même manière que le mutex pthread?

Tant que vous programmez sous Windows, évitez de réimplémenter le comportement de son Mutex. Être réentrant par le même fil est absolument essentiel pour son comportement défini.

Un object de synchronisation sans affinité de thread est un sémaphore qui compte pour 1. Utilisez CreateSemaphore ().

Fwiw, il est très curieux que vous ayez besoin de ce genre de comportement. Il semble que vous essayiez d’utiliser le même object de synchronisation à plusieurs endroits de manière inappropriée. Vous pouvez utiliser le sémaphore mais vous perdrez tout potentiel de concurrence. Envisagez d’utiliser plusieurs mutex à la place.

Vous ne pouvez pas modifier le fait que Windows Mutexes sont récursifs. Et tandis que les threads Posix ne sont pas récursifs par défaut, vous pouvez utiliser pthread_mutexattr_settype() avec l’indicateur PTHREAD_MUTEX_RECURSIVE pour en créer un.

Verrouiller un mutex sous Windows est en fait une opération assez coûteuse et mieux adaptée à la synchronisation inter-processus. Pour un mutex utilisé uniquement dans un processus unique, une section critique est normalement utilisée, mais celles-ci sont également ré-entrantes. Comme le dit nobugz, vous devez utiliser un sémaphore, initialisé avec un nombre maximal de 1, pour obtenir une synchronisation non récursive.

Un object sémaphore est comme un compteur spécial, qui peut être incrémenté et décrémenté de manière atomique sur les threads (ou les processus, s’il est créé partagé). En en créant un avec un nombre maximum de 1, vous obtenez le comportement non récursif dont vous avez besoin.

  • MSDN: objects de section critiques
  • MSDN: objects sémaphore

Je suggère d’utiliser des verrous de lecture / écriture (aka SRW) . Comme Windows Mutex, ils ne sont pas récursifs. Comme les sections critiques, elles sont légères et n’appellent pas le kernel si elles sont libres ( Benchmarks ).

Jetez un oeil à cet article sous «mutex rapide» .

Ce type de mutex ne peut pas être acquis de manière récursive.

Bien sûr, vous devriez examiner comment les mettre en œuvre en C.