2010-03-17 228 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. 使用静态互斥锁有什么不对吗?


编辑:链接问题在CPP

boost::mutex MyClass::mx; 
+1

如果您使用静态互斥锁,您将序列化所有类的实例,完全否定您可能通过多线程获得的任何好处。你确定你想要吗? – 2010-03-17 14:56:45

+0

@John Dibling 是的,只有创建和销毁对象才会受到保护 - 它不会经常发生。剩下的时间,这些实例将被使用而不锁定互斥锁,它应该是非常有效的。 – 2010-03-17 15:03:54

+0

@Dmity:这引出我的下一个问题:你确定没有锁定的情况下使用这些实例是安全的吗? – 2010-03-17 16:05:23

回答

37

您已声明固定正确的定义,但没有定义类的静态互斥。只需将行

boost::mutex MyClass::mx; 

添加到带有MyClass实现的cpp文件。

+0

10倍,它确实解决了链接问题。我试着定义它,但错过了MyClass :: mx之前的类型 – 2010-03-17 14:42:15