2010-06-26 10 views
1

J'utilise une bibliothèque C++ tierce (OpenFst), qui n'est pas particulièrement conçue pour être thread-safe. Cependant, il y a des classes Mutex inutilisées.Comment puis-je créer une bibliothèque de threads sécurisée pour les threads Boost?

Maintenant, je voudrais appeler certaines fonctions de cette bibliothèque et les exécuter dans les threads Boost. Comment puis je faire ça? Est-ce que je dois juste écrire des classes Mutex supplémentaires?

En particulier, certains de mes threads utiliseront certaines structures de données de cette bibliothèque jusqu'à ce qu'ils trouvent qu'un autre thread a produit des copies mises à jour de ces structures. Je suis nouveau dans les threads et je ne sais pas par où commencer ...

Répondre

5

Le moyen le plus sûr est de s'assurer qu'un seul thread appelle à la fois dans la bibliothèque tierce - c'est-à-dire, de prendre un mutex Chaque appel à la bibliothèque. Faire en sorte que plusieurs threads puissent utiliser la bibliothèque à la fois, cependant, va être assez complexe, et nécessite une bonne compréhension de la conception threadsafe ainsi que la conception de la bibliothèque elle-même. Si vous auditez la bibliothèque et constatez qu'elle n'a aucun état global (par exemple, manipuler un FST n'interagira jamais, JAMAIS, JAMAIS, avec les mêmes données qu'une autre manipulation FST), alors il peut être sûr de prendre des mutex au niveau des FST individuels. Et s'il existe des méthodes qui ne modifient pas du tout les structures FST, il peut être sûr de les exécuter dans plusieurs threads, à condition qu'il n'y ait pas d'écrivains dans le même FST. Cependant, cela nécessite un audit minutieux du code OpenFST. Je recommande de travailler avec les développeurs OpenFST d'origine ici; ils devraient être en mesure d'aider à signaler les pièges potentiels et les problèmes de threading.

0

Vous ne souhaitez pas bloquer l'accès à l'intégralité de la bibliothèque. Au lieu de cela, utilisez simplement votre tête - si vous avez une structure de données qui peut être mise à jour pendant la durée de vie de n'importe quel thread, puis synchronisez l'accès à cette structure de données.

S'il a été créé avant l'exécution d'un thread et qu'il est utilisé en lecture seule, aucune synchronisation ne doit être effectuée.