Win32 Lecture/Écriture De Verrouillage En Utilisant Uniquement Les Sections Critiques
- Je mettre en place un verrou lecture/écriture en C++ à l'aide de l'api Win32 dans le cadre d'un projet au travail. Toutes les solutions existantes utiliser les objets du noyau (les sémaphores et les mutex) qui nécessitent un changement de contexte au cours de l'exécution. Ce qui est beaucoup trop lent pour mon application.
J'aimerais mettre en œuvre un en utilisant uniquement des sections critiques, si possible. La serrure n'a pas à être processus de sécurité, seulement des threads. Des idées comment aller à ce sujet?
OriginalL'auteur Dan Lorenc | 2009-06-17
Vous devez vous connecter pour publier un commentaire.
Je ne pense pas que cela peut être fait sans l'aide d'au moins un noyau d'objet de niveau (Mutex ou Sémaphore), parce que vous avez besoin de l'aide du noyau de rendre le processus appelant bloc jusqu'à ce que le verrou est disponible.
Sections critiques fournissent de blocage, mais l'API est trop limitée. par exemple, vous ne pouvez pas saisir un CS, de découvrir qu'un verrou de lecture est disponible, mais pas un verrou en écriture, et d'attendre pour les autres processus de finir la lecture (parce que si les autres processus de la section critique, il permet de bloquer les autres lecteurs, ce qui est faux, et si ce n'est pas alors votre processus se bloque pas mais le spin, la gravure de cycles CPU.)
Cependant, ce que vous pouvez faire est d'utiliser un verrou de rotation et de revenir à un mutex lorsqu'il y a conflit. La section critique est elle-même mise en œuvre de cette façon. Je voudrais prendre un existant de la section critique de la mise en œuvre et de remplacer le champ PID avec lecteur séparé & écrivain qui compte.
OriginalL'auteur finnw
Si vous pouvez cibler Vista ou supérieur, vous devez utiliser le haut -SRWLock de l'. Ils sont légers comme des sections critiques, entièrement en mode utilisateur lorsqu'il n'existe aucun conflit.
Joe Duffy blog a quelques récentes entrées sur la mise en œuvre de différents types de non-blocage lecteur/enregistreur de serrures. Ces verrous de faire tourner, de sorte qu'ils ne serait pas approprié, si vous avez l'intention de faire beaucoup de travail tout en maintenant le verrou. Le code est en C#, mais devrait être très simple à port natif.
Vous pouvez mettre en œuvre un lecteur/enregistreur de verrouillage à l'aide de sections critiques et des événements, vous avez juste besoin de garder suffisamment d'état, seul le signal de l'événement, si nécessaire, pour éviter une inutile en mode noyau appel.
OriginalL'auteur Michael
Vieille question, mais c'est quelque chose qui devrait fonctionner. Elle ne tourne pas sur la contention. Les lecteurs engager limitée des frais supplémentaires s'ils ont peu ou pas de conflit, car
SetEvent
est appelé paresseusement (regardez l'historique d'édition pour une version poids lourd qui n'ont pas cette optimisation).Vous pouvez diminuer le coût pour les lecteurs en utilisant un seul
CRITICAL_SECTION
:countsLock
est remplacé parwriterLock
dans rdlock et rdunlockrwlock->waitingWriter = FALSE
est retiré dans wrunlockwrlock du corps est changé à
Cependant ce perd dans l'équité, donc je préfère la solution ci-dessus.
Drôle que nous avons écrit presque exactement le même code.
J'ai inclus une nouvelle version de l'algorithme qui est beaucoup moins cher sur les lecteurs.
OriginalL'auteur Paolo Bonzini
Prendre un coup d'oeil au livre "La Programmation simultanée sur Windows" qui a beaucoup de différents exemples de référence pour lecteur/enregistreur de serrures.
OriginalL'auteur Paul Alexander
Découvrez la spin_rw_mutex de Intel Fil De Blocs De Construction ...
OriginalL'auteur JP Alioto
C'est une vieille question, mais peut-être que quelqu'un va trouver cela utile. Nous avons développé une haute performance, open-source
RWLock
pour Windows qui utilise automatiquement Vista+SRWLock
Michael mentionné si disponible, ou sinon retombe à un espace utilisateur mise en œuvre.Comme un bonus supplémentaire, il y a quatre différents "types" de celui-ci (bien que vous pouvez coller à la base, qui est aussi le plus rapide), chacun offrant plus d'options de synchronisation. Il commence avec la base
RWLock()
qui est non réentrant, limitées à un seul processus de synchronisation, et sans échange de lire/écrire les serrures à part entière de la croix-processus de la CIB RWLock avec la ré-entrée de soutien et de lecture/écriture de l'altitude.Comme mentionné précédemment, ils dynamiquement swap à la Vista+ slim verrous en lecture /écriture pour de meilleures performances lorsque c'est possible, mais vous n'avez pas à vous inquiéter à ce sujet qu'il va revenir à une implémentation compatible sur Windows XP et de ses semblables.
OriginalL'auteur Mahmoud Al-Qudsi
Si vous savez déjà d'une solution qui seulement utilise les mutex, vous devriez être en mesure de le modifier pour utiliser les sections critiques à la place.
Nous avons lancé notre propre aide de deux sections critiques et des compteurs. Ce qui correspond à nos besoins, nous avons une très faible écrivain comte, écrivains obtenir la priorité sur les lecteurs, etc. Je n'ai pas la liberté de publier la nôtre mais qui peut dire qu'il est possible sans les mutex et les sémaphores.
Pas clair ce que vous entendez uniquement le thread qui possède un mutext pouvez le déverrouiller. Une fois qu'un mutex est déverrouillé, n'importe qui peut le verrouiller. De même, avec une section critique.
Désolé, je voulais dire un sémaphore. J'ai besoin d'une solution où tout le monde peut décrémenter le sémaphore, ce qui n'est pas possible avec des sections critiques.
Selon ce que le sémaphore est utilisé, vous pourriez être en mesure d'utiliser un compteur qui est modifié par InterlockedIncrement/InterlockedDecrement.
OriginalL'auteur sean e
Ici est la plus petite solution qui me vient en tête:
http://www.baboonz.org/rwlock.php
Et collé verbatim:
OriginalL'auteur Ben Harper
Regarder ma mise en œuvre ici:
https://github.com/coolsoftware/LockLib
VRWLock est une classe C++ qui implémente seul écrivain de plusieurs lecteurs logiques.
Aussi regarder projet de test TestLock.la sln.
UPD. Ci-dessous est le code simple pour le lecteur et l'écrivain:
VRWLock classe prend en charge nombre de rotations et de thread spécifique de comptage de référence qui permet de libérer les verrous de résiliation threads.
OriginalL'auteur Vitaly
J'ai écrit le code suivant en utilisant uniquement les sections critiques.
Pour effectuer un spin-attendez, commenter les lignes avec le Sommeil(0).
OriginalL'auteur jesusdario