2006年11月24日

シングルトンとマルチスレッド

C++のSingletonパターンの実装のうち、有名なものの1つとして、以下のようなローカルstatic変数を使った実装があります。

class Foo
{
public:
  static Foo& GetInstance(void);
};

Foo& Foo::GetInstance(void)
{
  static Foo Instance;
  return Instance;
}

最近、この実装がスレッドセーフではないことに気が付きました。
そんなの当たり前だろ!と突っ込まれそうですが、スレッドセーフか?と疑ったことが無かったので気が付きませんでした。

このコードがスレッドセーフにするためには、コンパイラは以下の点を守るようならなければなりません。

  • Fooのコンストラクタを2回呼び出さない。
  • Fooのコンストラクタが実行し終わるまで、他の関数を呼び出さない。
まあふつーに無理そうですね。実際に無理のようです。

代わりにデファクトスタンダードなSingletonライブラリを使おうかと思ったのですが、 デファクトスタンダードな代物が見つからず・・・。boostにあると思ったのですが、 boostのSingletonクラスはboost::details::pool::singleton。poolのおまけみたいです。
どれを使うべきか良く分からなかったので、とりあえず複数スレッドを起動する前にインスタンスを生成してしまうことにしました。お終い。

しかし、 「C++ Singleton」で検索したり、 「boost Singleton」で検索したりすると分かるのですが、Singletonの実装って奥が深いようですね。正直近寄りたくないくらいに・・・

以下、参考情報です。

投稿者 MASATO : 2006年11月24日 21:56 | トラックバック
コメント
コメントする









名前、アドレスを登録しますか?