J'ai une classe partagée entre plusieurs projets, certains d'entre eux sont mono-thread et d'autres sont multi-thread. Les utilisateurs mono-thread ne veulent pas la surcharge du verrouillage mutex, et les utilisateurs multithread ne veulent pas faire leur propre verrouillage et veulent pouvoir s'exécuter en mode "single-threaded". Je voudrais donc pouvoir choisir entre les mutex réels et "muets" à l'exécution.Sélection du mutex ou du mutex fictif à l'exécution
Idéalement, j'aurais un shared_ptr<something>
et j'attribuerais un objet mutex réel ou faux. Je voudrais alors "verrouiller" ceci sans tenir compte de ce qu'il y a dedans.
unique_lock<something> guard(*mutex);
... critical section ...
Maintenant il y a une signals2::dummy_mutex
mais il ne partage pas une classe de base commune avec boost::mutex
. Alors, quelle est la manière élégante de choisir entre un mutex réel et un mutex factice (celui de signals2 ou autre chose) sans rendre le code de verrouillage/garde plus compliqué que l'exemple ci-dessus?
Et, avant que vous soulignez les alternatives:
- je pourrais sélectionner une mise en œuvre au moment de la compilation, mais les macros de préprocesseur sont laids et maintenir les configurations de projet est pénible pour nous.
- Les utilisateurs de la classe dans un environnement multithread ne veulent pas prendre la responsabilité de verrouiller l'utilisation de la classe plutôt que de laisser la classe effectuer son propre verrouillage interne.
- Il existe trop d'API et d'utilisations existantes pour qu'un «wrapper thread-safe» soit une solution pratique.
Ajoutez une méthode try_lock() et elle sera conforme au concept Lockable à utiliser avec la classe unique_lock. Voir: http://www.boost.org/doc/libs/1_41_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.lockable –
@Jason Thx mis à jour pour faire cela. –
+1. C'est essentiellement un "polymorphisme externe" tel que décrit ici: http://www.cs.wustl.edu/~schmidt/PDF/External-Polymorphism.pdf. – Void