web-dev-qa-db-ja.com

クラスでの静的ミューテックスの使用

多くのインスタンスを持つことができるクラスがあります。内部では、(一部のグローバル変数を使用する)サードパーティのライブラリから一部のメンバーを作成および初期化し、スレッドセーフではありません。

静的な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;
31
Dmitry Yudakov

クラス静的ミューテックスを宣言しましたが、定義していません。行を追加するだけです

boost::mutex MyClass::mx;

myClassの実装を含むcppファイルに。

46