C++のSingletonパターンの実装のうち、有名なものの1つとして、以下のようなローカルstatic変数を使った実装があります。
class Foo { public: static Foo& GetInstance(void); }; Foo& Foo::GetInstance(void) { static Foo Instance; return Instance; }
最近、この実装がスレッドセーフではないことに気が付きました。
そんなの当たり前だろ!と突っ込まれそうですが、スレッドセーフか?と疑ったことが無かったので気が付きませんでした。
このコードがスレッドセーフにするためには、コンパイラは以下の点を守るようならなければなりません。
代わりにデファクトスタンダードなSingletonライブラリを使おうかと思ったのですが、
デファクトスタンダードな代物が見つからず・・・。boostにあると思ったのですが、
boostのSingletonクラスはboost::details::pool::singleton。poolのおまけみたいです。
どれを使うべきか良く分からなかったので、とりあえず複数スレッドを起動する前にインスタンスを生成してしまうことにしました。お終い。
しかし、 「C++ Singleton」で検索したり、 「boost Singleton」で検索したりすると分かるのですが、Singletonの実装って奥が深いようですね。正直近寄りたくないくらいに・・・
以下、参考情報です。