web-dev-qa-db-fra.com

Utilisation d'un mutex statique dans une classe

J'ai une classe dont je peux avoir plusieurs exemples. À l'intérieur, il crée et initialise certains membres à partir d'une bibliothèque tierce (qui utilise certaines variables globales) et n'est pas adapté aux threads.

J'ai pensé à utiliser boost statique :: mutex, qui serait verrouillé dans mon constructeur et destructeur de classe. Ainsi, la création et la destruction d'instances parmi mes threads seraient sans danger pour les membres tiers.



class MyClass

{
  static boost::mutex mx;

  // 3rd party library members
public:
  MyClass();
  ~MyClass();
};

MyClass::MyClass()
{
  boost::mutex::scoped_lock scoped_lock(mx);
  // create and init 3rd party library stuff
}

MyClass::~MyClass()
{
  boost::mutex::scoped_lock scoped_lock(mx);
  // destroy 3rd party library stuff
}

Je ne peux pas créer de lien car je reçois une erreur:

undefined reference to `MyClass::mx`
  1. Ai-je besoin d'une initialisation spéciale de ce membre statique?

  2. Y a-t-il quelque chose de mal à utiliser un mutex statique?


Edit: Le problème de liaison est corrigé avec une définition correcte dans cpp

boost::mutex MyClass::mx;
31
Dmitry Yudakov

Vous avez déclaré, mais pas défini votre mutex statique de classe. Ajoutez simplement la ligne

boost::mutex MyClass::mx;

dans le fichier cpp avec l'implémentation de MyClass.

46
Stephen C. Steel