アプリ版:「スタンプのみでお礼する」機能のリリースについて

私は今までDouble Checked Locking Patternを使ってSingletonを実装していましたが、
これがどうもスレッドセーフではないらしく、
スレッドセーフなSingletonのソースを探しています。

検索エンジンや書籍で漁っているものの奥が深いらしく、
スレッドセーフでなかったりDouble Checked Locking Patternが使われているものばかりで、
目的のものは見つかりませんでした。

C++においてスレッドセーフなSingletonを実装することは、
もしかして不可能なのでしょうか?
もしソースや方法をご存知の方がいらっしゃればお教えいただけると助かります。
よろしくお願いします

A 回答 (2件)

 こんにちは。


 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;
}

 と変形した事で、効率が上がったものの、完全では無くなってしまったのでは無いでしょうか。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
ということは、上方にご提示いただいたソースは
スレッドセーフということでしょうか?

JavaでもDouble Checked Locking Patternが使われてるみたいで、問題になってるみたいですね。
こういう見えないセキュリティの穴って怖いです。

http://www.ibm.com/developerworks/jp/java/librar …
http://ml.tietew.jp/cppll/cppll/article/11704

お礼日時:2009/04/24 15:42
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
static変数だと衝突はしなさそうですが
任意のタイミングでインスタンスの生成解放ができないのと、
C++は初期化されるタイミングは不定なので、
JavaをC++移植するにしてもこの方法だとプログラムの組み方によっては問題があった気がします・・・。
私の勘違いでしたらすみません。

お礼日時:2009/04/24 15:46

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!