13

スマート ポインターでシングルトン パターンを処理する親クラスを作成します。

.h ファイル:

template<class singleType>
class Singleton
{
public:
    static std::shared_ptr<singleType> GetInstance();

private:
    static std::weak_ptr<singleType> m_singleObject;
};

.cpp ファイル:

template<class singleType>
std::shared_ptr<singleType> Singleton<singleType>::GetInstance()
{
    auto shareObject = m_singleObject.Lock();
    if (!shareObject)
    {
        shareObject.reset(new singleType);
        m_singleObject = shareObject;
    }

    return shareObject;
}

スマート ポインターの正しい使い方がわからない場合は、何か案が?

どうもありがとう

4

4 に答える 4

4

あなたのコードはスレッドセーフではありません。

名前lockは同時アクセスがブロックされていることを示唆しているかもしれませんが、実際にはそのような保証はありません。複数のスレッドGetInstanceが関数を同時に呼び出すと、単一のインスタンスを保証するのではなく、複数のインスタンスを取得します。

GetInstance関数の存続期間全体にわたって明示的なロックを作成する必要があります。もちろん、これはあまり効率的ではないことに注意してください。

于 2013-04-22T07:45:25.260 に答える
1

私の知る限りでは、これで問題ないはずです。順不同の破棄の問題は回避できますが、最初のインスタンスが作成された後に新しいインスタンスを作成すると問題が発生する可能性があります。このシングルトンは常に 1 つのインスタンスのみを有効にしますが、プログラムの実行中に複数のインスタンスが全体的に有効になる可能性があります。

この破壊と再作成は、副作用だけでなく、パフォーマンスの観点からも望ましくない場合があります。

于 2013-04-22T06:05:51.933 に答える