
標準C++でシングルトンを実装したいのですが。
class Singleton{
public:
static Singleton* getInstance(){
if (_instance == NULL){
//スレッドAがこの時点で、スレッドBがNULLチェックすると破綻する
_instance = new Singleton();
}
return _instance;
}
private:
Singleton();
static Singleton* _instance;
};
マルチスレッドになると上記のパターンで破綻するといわれどうしたものかと考えております。
static Singleton* _instance = new Singleton();
と出来れば解決なのですが
「static const int データメンバ以外をクラス内で初期化することはできません」
とのことでそれもできず。
どのようにすればよいでしょうか。
No.3ベストアンサー
- 回答日時:
こんにちは。
すんません、的外れな事を書いてしまいました。・「static const int データメンバ以外をクラス内で初期化することはできません」
と言うのは、staticメンバ変数の初期化手段を間違えているからではないでしょうか。
ヘッダの中で初期化するのではなく、改めてソースの中に、
Singleton* Singleton::_instance = new Singleton();
と書きます。
回答ありがとうございます。
こちらこそ申し訳ありません。
想像していたよりも複雑なコードが返ってきて戸惑っておりました。
>ヘッダの中で初期化するのではなく、改めてソースの中に、
より、
Singleton.class---------
class StringPlus{
public:
static StringPlus* StringPlus::instance(){
return _instance;
}
private:
StringPlus(){}
static StringPlus* _instance;
};
Singleton.cpp-----------------
StringPlus* StringPlus::_instance = new StringPlus();
で解決、と私は思っていたのですが・・・あれ?
No.2
- 回答日時:
> どのようにすればよいでしょうか?
・シングルトンの使用をやめる。
・シングルトンのインスタンスがスレッド群に参照される前に必ず初期化されることを保証する手順を考える。
ですかね。
Double checked lockingという手法があるようですが、
http://www.sun-inet.or.jp/~yaneurao/yaneSDK3rd/c …
そこにも穴があって、完璧なシングルトンをマルチスレッドで
実装するのは、C++だけでは無理なよう。理由は以下を参照。
http://qo.sakuratan.com/2008/09/03/doublecheaklo …
ありがとうございます。
スレッドの流れを一旦止める、なんて手段をとっているんですね。
ダブルまではわかるのですがトリプルにする意味がよくわかりませんでした。
>実装するのは、C++だけでは無理なよう。理由は以下を参照。
C++への理解が足らないようでほとんど理解出来ませんでした。
いずれにせよ現時点で完璧なシングルトンは考えない方がよさそうですね。(私自身の未熟さ故)
No.1
- 回答日時:
こんにちは。
例えば、windowsの場合では以下の様な感じです。雑ですが、参考程度に。
class Exclusive
{
public:
virtual ~Exclusive(){}
virtual bool lock() = 0;
virtual bool unlock() = 0;
};
//排他リソースクラス(環境に応じて中を変える)
class Critical : public Exclusive
{
public:
Critical() : _block(false)
{
//排他リソース初期化
::InitializeCriticalSection(&_cs);
}
~Critical()
{
//排他リソース削除
::DeleteCriticalSection(&_cs);
}
bool lock()
{
//排他リソースロック
if(_block)return false;
::EnterCriticalSection(&_cs);
_block = true;
return true;
}
bool unlock()
{
//排他リソース解除
if(!_block)return false;
::LeaveCriticalSection(&_cs);
_block = false;
return true;
}
private:
bool _block;
CRITICAL_SECTION _cs;
};
//コンストラクタ/デストラクタを利用して排他リソースクラスのlock()/unlock()を呼び出すクラス
class Block
{
public:
explicit Block(Exclusive* p) : _p(p)
{
_p->lock();
}
~Block()
{
_p->unlock();
}
private:
Exclusive* _p;
};
//シングルトン
class Singleton
{
public:
static Singleton* getInstance()
{
//ココでブロックする
volatile Block block(&_critical);
if(_instance == NULL)
{
_instance = new Singleton();
}
return _instance;
}
private:
Singleton(){}
static Singleton* _instance;
static Critical _critical;
};
//staticメンバの初期化
Singleton* Singleton::_instance = NULL;
Critical Singleton::_critical;
//スレッド内で使用する
Singleton* p = Singleton::getInstance();
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# int tff(int clk) { static int state = 0; //状態 stat 1 2022/07/11 21:14
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
一部の文字列を数値に変える方法
-
Javascriptでクラスの順番を入...
-
違うクラスからの変数の共有化
-
アブストラクトとインターフェ...
-
ネストしたenumへのリフレクシ...
-
無名パッケージからのインポート
-
クラス間でのデータ参照
-
「オブジェクト志向」の考えか...
-
デシリアライズでオブジェクト...
-
javaの配列とクラス
-
VB.NETで出来てC#で出来ない???
-
この問題の解説をお願いします。
-
FilterReader クラスのカスタム...
-
C#にて別クラスの関数を使いたい
-
(クラス名.this.メソッド)って...
-
範囲外の数値を代入したらエラ...
-
相互的な検索のできるハッシュ...
-
関数内の変数に<summary>コメン...
-
Genericsの型パラメータ
-
C# log4netの使い方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#でほかのファイルにある自作...
-
C#にて別クラスの関数を使いたい
-
クラス間でのデータ参照
-
import と extends について
-
c++,ある関数のクラスから別の...
-
範囲外の数値を代入したらエラ...
-
C#のクラスライブラリでメッセ...
-
C++でfriendクラスにしているの...
-
ひとつのファイルにクラスは1つ?
-
無名パッケージからのインポート
-
継承したクラス側のクラス名の取得
-
visual studioのデザイナ画面で...
-
a href="..." とServlet
-
Java リフレクションについて
-
構造 他のクラスの構造体を別...
-
ASP Pageの孫継承のPage_Load
-
別ファイルのclassの読み込みに...
-
オーバーロードしたメンバ関数...
-
実行可能jarファイルのファイル...
おすすめ情報