Exemple pour stimuler shared_mutex (plusieurs lectures/d'une écriture)?
J'ai une application multithread qui y a qu'à lire certaines données souvent, et de temps en temps que de données est mise à jour. Droit maintenant un mutex garde d'accès pour que la sécurité des données, mais c'est cher parce que je tiens de plusieurs threads pour être en mesure de lire simultanément, et de verrouiller uniquement quand une mise à jour est nécessaire (la mise à jour de thread pourrait attendre que les autres threads à la fin).
Je pense que c'est ce boost::shared_mutex
est censé faire, mais je ne suis pas clair sur la façon de l'utiliser, et n'ai pas trouvé un exemple clair.
Quelqu'un aurait-il un exemple simple que je pourrais utiliser pour commencer?
- 1800 INFORMATION de l'exemple est correct. Voir aussi cet article: Quoi de neuf dans Boost Threads.
- double possible de Lecteur/graveur de Serrures en C++
Vous devez vous connecter pour publier un commentaire.
Il semble que vous feriez quelque chose comme ceci:
1800 de l'INFORMATION est plus ou moins correct, mais il ya quelques questions que j'ai voulu corriger.
Noter également, à la différence d'un shared_lock, un seul thread peut acquérir une upgrade_lock à un moment, même lorsqu'il n'est pas mis à jour (j'ai pensé que c'était bizarre quand je suis tombé sur ça). Ainsi, si tous vos lecteurs sont conditionnelle écrivains, vous avez besoin de trouver une autre solution.
boost::unique_lock< boost::shared_mutex > lock(lock);
lireboost::unique_lock< boost::shared_mutex > lock(
_access);
?'boost::shared_lock<Mutex>::shared_lock(const boost::shared_lock<Mutex> &)' : cannot convert parameter 1 from 'const boost::shared_mutex' to 'const boost::shared_lock<Mutex> &'
boost::lock_guard
en place d'unboost::unique_lock
aussi correct? En regardant cette réponse (stackoverflow.com/a/6731889/1165051), il semble que le premier est un peu plus efficace, mais je veux m'assurer de l'exactitude est assurée dans le cas de la lecture-écriture de verrouillage.Vous pouvez utiliser boost pour créer un verrou en lecture /écriture:
typedef boost::unique_lock< Lock > WriteLock; typedef boost::shared_lock< Lock > ReadLock;
.#include <boost/thread.hpp>
Juste pour ajouter un peu plus empirique info, j'ai fait des études sur l'ensemble de la problématique évolutive de serrures, et Exemple pour stimuler shared_mutex (plusieurs lectures/d'une écriture)? est une bonne réponse à l'ajout de l'information importante qu'un seul thread peut avoir un upgrade_lock même si il n'est pas mis à niveau, ce qui est important car cela signifie que vous ne pouvez pas mettre à niveau à partir d'un verrou partagé d'un unique verrouillage sans relâcher le verrou partagé en premier. (Ce point a été discuté ailleurs mais le plus intéressant thread est ici http://thread.gmane.org/gmane.comp.lib.boost.devel/214394)
Toutefois j'en ai trouvé un d'important (sans-papiers) la différence entre un thread en attente d'une mise à niveau vers un verrou (ie doit attendre que tous les lecteurs de libération du verrou partagé) et un verrou en écriture d'attente pour la même chose (c'est à dire une unique_lock).
Le thread est en attente d'une unique_lock sur le shared_mutex bloque les nouveaux lecteurs de venir, ils doivent attendre que les écrivains de la demande. Cela garantit lecteurs de ne pas mourir de faim écrivains (toutefois, je crois que les écrivains pourraient mourir de faim lecteurs).
Le thread est en attente d'une upgradeable_lock de mise à niveau permet à d'autres threads pour obtenir un verrou partagé, de sorte que ce fil pourrait être affamé " si les lecteurs sont très fréquentes.
C'est une question importante à envisager, et devrait probablement être documentées.
Terekhov algorithm
assure que dans1.
, l'écrivain ne peut pas mourir de faim les lecteurs. Voir this. Mais2.
est vrai. Un upgrade_lock ne garantit pas l'équité. Voir this.Utilisation d'un sémaphore avec un nombre qui est égal au nombre de lecteurs. Permettre à chaque lecteur de prendre un nombre de sémaphore afin de les lire, de cette façon, ils peuvent tout lire en même temps. Ensuite, laissez l'écrivain de prendre TOUT le sémaphore compte avant d'écrire. Cela provoque l'écrivain à attendre que toutes les lectures à la fin et ensuite de bloquer le lit tout en écrivant.
Grande réponse par Jim Morris, je suis tombé sur ce et il m'a fallu un certain temps pour comprendre. Voici un code simple qui montre qu'après l'envoi d'une "demande" pour un unique_lock boost (version 1.54) bloque tous les shared_lock demandes. C'est très intéressant car il me semble que le choix entre unique_lock et upgradeable_lock permet si nous voulons écrire prioritaire ou non prioritaire.
Aussi (1) de Jim Morris post semble contredire ce:
Boost shared_lock. Lire préféré?