Verrous à plusieurs lecteurs et à écriture unique dans Boost
Je suis en train de mettre en œuvre le code suivant dans un multithreading scénario:
Get shared access to mutex
Read data structure
If necessary:
Get exclusive access to mutex
Update data structure
Release exclusive lock
Release shared lock
Boost fils a un shared_mutex
classe qui a été conçu pour plusieurs lecteurs, un seul écrivain de modèle. Il y a plusieurs stackoverflow des questions concernant cette classe. Cependant, je ne suis pas sûr qu'il s'adapte le scénario ci-dessus où tout lecteur peut devenir un écrivain. La documentation précise:
La UpgradeLockable concept est un
le raffinement de la SharedLockable
concept qui permet évolutive
la propriété ainsi que le partage de la propriété
et la propriété exclusive. C'est un
extension aux multiples-reader /
une seule écriture modèle fourni par la
SharedLockable concept: un unique
thread peut avoir évolutive de la propriété
dans le même temps, comme d'autres l'ont partagé
la propriété.
Du mot "unique", je soupçonne qu'un seul thread peut tenir d'une mise à niveau de verrouillage. Les autres ne détiennent un verrou partagé qui ne peut pas être mis à niveau vers un verrou exclusif.
Savez-vous si boost::shared_lock
est utile dans cette situation (n'importe quel lecteur peut devenir un écrivain), ou si il y a d'autres façon d'atteindre cet objectif?
source d'informationauteur Amnon
Vous devez vous connecter pour publier un commentaire.
Oui, vous pouvez faire exactement ce que vous voulez, comme indiqué dans la accepté de répondre à ici. Un appel à la mise à niveau à l'accès exclusif bloquera jusqu'à ce que tous les lecteurs sont fait.
boost::shared_lock
n'aide pas dans cette situation (de plusieurs lecteurs, qui peuvent devenir des écrivains), depuis un seul thread peut être propriétaire d'une mise à niveau de verrouillage. C'est à la fois implicite par la citation de la documentation dans la question, et en regardant le code (thread\win32\shared_mutex.ppr). Si un thread tente d'acquérir une mise à niveau de verrouillage, tandis qu'un autre thread détient un, il va attendre que l'autre thread.Je me suis installé sur l'utilisation régulière de verrouillage pour tous les lecteurs/enregistreurs, qui est OK dans mon cas puisque la section critique est courte.
Vous savez LightweightLock
ou même à LightweightLock_zip
fait exactement ce que vous voulez.
Je l'ai utilisé un temps long.
[MODIFIER]
voici le code source: