【发布时间】:2011-01-28 14:38:29
【问题描述】:
我有一个可以有很多实例的类。它在内部创建并初始化来自 3rd 方库的一些成员(使用一些全局变量)并且不是线程安全的。
我考虑过使用静态 boost::mutex,它会被锁定在我的类构造函数和析构函数中。因此,在我的线程中创建和销毁实例对于第 3 方成员来说是安全的。
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;
【问题讨论】:
-
如果您使用静态互斥锁,您将序列化您的类的所有实例的使用,完全否定您可能通过多线程获得的任何好处。你确定要这个吗?
-
@John Dibling 是的,只有创建和销毁对象才会受到保护——它不会经常发生。其余时间将在不锁定互斥锁的情况下使用实例,它应该非常有效。
-
@Dmity:这引出了我的下一个问题:您确定在不锁定的情况下使用实例是安全的吗?
-
@John Dibling 第 3 方库提供了一些锁定机制,可以保证线程安全的工作,但它们需要现有的对象 - 我的测试表明它正在工作。看起来虽然这些对象的并发创建不是很安全。
-
请记住,
class的static数据成员将在派生类的 AND 类实例的所有实例之间共享。您可能需要重新考虑static限定符。
标签: c++ linux multithreading boost