2

現在、マイヤーシングルトンのこの実装があります:

class ClassA
{
public:
    static ClassA& GetInstance()
    {                   
        static ClassA instance;     
        return instance;
    }   

private:
    ClassA::ClassA() {};

    // avoid copying singleton
    ClassA(ClassA const&);
    void operator = (ClassA const&);
};

C++-98 と VS-2008 でこのコード スレッド セーフを実現するには、改善が必要ですか?!

ありがとう!

PS: 不明な点は何ですか? タグ visual-studio-2008 と c++-98 が表示されます -> ターゲット OS は Windows です! また、シングルトンがまったく好きではない人がいるだけで、私が反対票を投じられた理由もわかりません!

4

1 に答える 1

5

一般的に、Meyer シングルトンは最適なソリューションではありません。特に、マルチスレッド環境ではそうではありません。シングルトンを実装するより一般的な方法は次のとおりです。

class ClassA
{
    static ClassA* ourInstance;
    //  ctor's, etc.
public:
    static ClassA& instance();
};

そしてソースファイルで:

ClassA* ClassA::ourInstance = &instance();

// This can be in any source file.
ClassA&
ClassA::instance()
{
    if ( ourInstance == NULL ) {
        ourInstance = new ClassA;
    }
    return *ourInstance;
}

これは、入る前にスレッドが作成されない 場合main(そうあるべきです)、動的にロードされない場合 (これもそうあるべきです — オブジェクトが一意であり、静的オブジェクトのコンストラクターからアクセスできる場合)はスレッドセーフです。次に、静的コンストラクターが実行されるときにそれらである必要があります)。また、破壊の順序の問題を回避できるという利点もあります。

于 2013-07-29T13:56:18.267 に答える