2010-03-17 2 views
25

У меня есть класс, который может иметь много экземпляров. Внутри он создает и инициализирует некоторые члены из сторонней библиотеки (которые используют некоторые глобальные переменные) и не является потокобезопасным.Использование статических мьютексов в классе

Я думал об использовании статического boost :: mutex, который был бы заблокирован в моем конструкторе класса и деструкторе. Таким образом, создание и уничтожение экземпляров среди моих потоков было бы безопасным для сторонних участников.



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 
} 
 

Я не могу связать, потому что я получаю сообщение об ошибке:

undefined reference to `MyClass::mx` 
  1. мне нужно сделать некоторые специальные инициализации такого статического члена?

  2. Есть ли что-то неправильное в использовании статического мьютекса?


Edit: Связывание проблема решена с правильным определением в CPP

boost::mutex MyClass::mx; 
+1

Если вы используете статический мьютекс, вы будете сериализовать использование * all * экземпляров вашего класса, полностью отрицая любое преимущество, которое вы можете получить благодаря многопоточности. Вы уверены, что хотите этого? –

+0

@John Dibling Да, только создание и уничтожение объектов будет защищено - это не произойдет слишком часто. В остальное время экземпляры будут использоваться без блокировки мьютекса, и он должен быть достаточно эффективным. –

+0

@Dmity: Это приводит меня к следующему вопросу: вы уверены, что безопасно использовать экземпляры без блокировки? –

ответ

37

Вы объявили, но не определили свой класс статический мьютекс. Просто добавьте строку

boost::mutex MyClass::mx; 

в файл cpp с реализацией MyClass.

+0

10x, он устранил проблему с привязкой. Я попытался определить его раньше, но пропустил тип до MyClass :: mx –

Смежные вопросы