私は今までDouble Checked Locking Patternを使ってSingletonを実装していましたが、
これがどうもスレッドセーフではないらしく、
スレッドセーフなSingletonのソースを探しています。
検索エンジンや書籍で漁っているものの奥が深いらしく、
スレッドセーフでなかったりDouble Checked Locking Patternが使われているものばかりで、
目的のものは見つかりませんでした。
C++においてスレッドセーフなSingletonを実装することは、
もしかして不可能なのでしょうか?
もしソースや方法をご存知の方がいらっしゃればお教えいただけると助かります。
よろしくお願いします
A 回答 (2件)
- 最新から表示
- 回答順に表示
No.1
- 回答日時:
こんにちは。
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/librar …
http://ml.tietew.jp/cppll/cppll/article/11704
No.2
- 回答日時:
ご回答ありがとうございます。
static変数だと衝突はしなさそうですが
任意のタイミングでインスタンスの生成解放ができないのと、
C++は初期化されるタイミングは不定なので、
JavaをC++移植するにしてもこの方法だとプログラムの組み方によっては問題があった気がします・・・。
私の勘違いでしたらすみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# LU分解法のピボット選択機能実装について(C言語・gcc-9) 1 2022/07/22 15:20
- その他(パソコン・周辺機器) タブレットで使用するUSBメモリについて 7 2022/05/26 14:27
- レシピ・食事 ボケのジャムを使った料理レシピは。 3 2022/11/04 17:01
- ドライブ・ストレージ SSDからHDDへのOSを含んだ換装 12 2023/01/19 03:30
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- 教えて!goo 指摘されたので質問です 1 2022/04/17 14:11
- Excel(エクセル) エクセルVBAについて質問です。 2 2022/12/09 17:59
- ファミレス・ファーストフード マクドナルドに働いている方、詳しい方に質問です。 私は今日、無性にマックナゲットを食べたくなり、ナゲ 1 2022/05/04 23:44
- C言語・C++・C# (C言語)めちゃくちゃな値になってしまいます。 5 2022/08/13 11:55
- Mac OS BOOK Air HDMI入力を表示するソフト 1 2023/01/21 18:06
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VBA エンターキーでイベントに...
-
アクセスVBAのMe!と[ ]
-
エクセルのデータをwebフォーム...
-
桐V9での値の取得
-
<OBJECT>タグからJavascript呼...
-
エクセルVBAでセル番地を指定し...
-
ACCESSマクロ、Me![氏名] その...
-
「SHDocVw」の意味
-
【エクセル】複数のTextBoxに共...
-
Excel VBAでマウスの左クリック...
-
日本語の文字化けを直す方法
-
ディスクの総セクタサイズを取...
-
Access からオブジェクトとして...
-
VBAで選択範囲外の図形(オブジ...
-
ExcelのシートをAccessで表示し...
-
VBAでフォームのコントロールの...
-
VB.NET Image型データをファイ...
-
Bitmap.GetPixelより高速なもの
-
コードでオブジェクトを最前面に
-
EXCEL VBA ユーザフォームで複...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
アクセスVBAのMe!と[ ]
-
VBA エンターキーでイベントに...
-
Excel VBAでマウスの左クリック...
-
文字列で小数点以下の0を削除し...
-
【エクセルのマクロ】クリップ...
-
エクセルVBAでセル番地を指定し...
-
Excel2007 でのチェックボック...
-
Accessのフォーム上にエクセル...
-
日本語の文字化けを直す方法
-
エクセルのデータをwebフォーム...
-
現在アクティブになっているオ...
-
PowerpointVBAで指定のShapeオ...
-
コードでオブジェクトを最前面に
-
【エクセル】複数のTextBoxに共...
-
Imageコントロールにグラフを表...
-
ユーザーフォームのインポート...
-
Access からオブジェクトとして...
-
構造体の静的な初期化
-
Excel VBA でPictureBoxオブジ...
-
「SHDocVw」の意味
おすすめ情報