У меня есть класс, который может иметь много экземпляров. Внутри он создает и инициализирует некоторые члены из сторонней библиотеки (которые используют некоторые глобальные переменные) и не является потокобезопасным.Использование статических мьютексов в классе
Я думал об использовании статического 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`
мне нужно сделать некоторые специальные инициализации такого статического члена?
Есть ли что-то неправильное в использовании статического мьютекса?
Edit: Связывание проблема решена с правильным определением в CPP
boost::mutex MyClass::mx;
Если вы используете статический мьютекс, вы будете сериализовать использование * all * экземпляров вашего класса, полностью отрицая любое преимущество, которое вы можете получить благодаря многопоточности. Вы уверены, что хотите этого? –
@John Dibling Да, только создание и уничтожение объектов будет защищено - это не произойдет слишком часто. В остальное время экземпляры будут использоваться без блокировки мьютекса, и он должен быть достаточно эффективным. –
@Dmity: Это приводит меня к следующему вопросу: вы уверены, что безопасно использовать экземпляры без блокировки? –