Ответ 1
Вы объявили, но не определили свой статический мьютекс класса. Просто добавьте строку
boost::mutex MyClass::mx;
в файл cpp с реализацией MyClass.
У меня есть класс, который может иметь много экземпляров. Внутри он создает и инициализирует некоторые члены из сторонней библиотеки (которые используют некоторые глобальные переменные) и не является потокобезопасным.
Я думал об использовании static 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`
Нужна ли мне специальная инициализация такого статического члена?
Есть ли что-то неправильное в использовании статического мьютекса?
Изменить: Проблема связывания исправлена с правильным определением в cpp
boost::mutex MyClass::mx;
Вы объявили, но не определили свой статический мьютекс класса. Просто добавьте строку
boost::mutex MyClass::mx;
в файл cpp с реализацией MyClass.