- 締切済み
C++でのスレッドセーフなSingletonデザインパターン
私は今までDouble Checked Locking Patternを使ってSingletonを実装していましたが、 これがどうもスレッドセーフではないらしく、 スレッドセーフなSingletonのソースを探しています。 検索エンジンや書籍で漁っているものの奥が深いらしく、 スレッドセーフでなかったりDouble Checked Locking Patternが使われているものばかりで、 目的のものは見つかりませんでした。 C++においてスレッドセーフなSingletonを実装することは、 もしかして不可能なのでしょうか? もしソースや方法をご存知の方がいらっしゃればお教えいただけると助かります。 よろしくお願いします
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chie65536(@chie65535)
- ベストアンサー率44% (8741/19839)
- machongola
- ベストアンサー率60% (434/720)
こんにちは。 Modern C++ Designで読んだ事がありますが、本来 Class* Class::Instance() { CLock lock(&this->mutex); if(pInst == NULL) pInst = new Class(); return pInst; } の筈が、此れだと呼び出す度に必ずlockオブジェクトが実行されて非効率なので、初期化時のみにロックを発生させる為 Class* Class::Instance() { if(pInst == NULL) { CLock lock(&this->mutex); if(pInst == NULL) pInst = new Class(); } return pInst; } と変形した事で、効率が上がったものの、完全では無くなってしまったのでは無いでしょうか。
お礼
ご回答ありがとうございます。 ということは、上方にご提示いただいたソースは スレッドセーフということでしょうか? JavaでもDouble Checked Locking Patternが使われてるみたいで、問題になってるみたいですね。 こういう見えないセキュリティの穴って怖いです。 http://www.ibm.com/developerworks/jp/java/library/j-dcl/index.html http://ml.tietew.jp/cppll/cppll/article/11704
お礼
ご回答ありがとうございます。 static変数だと衝突はしなさそうですが 任意のタイミングでインスタンスの生成解放ができないのと、 C++は初期化されるタイミングは不定なので、 JavaをC++移植するにしてもこの方法だとプログラムの組み方によっては問題があった気がします・・・。 私の勘違いでしたらすみません。