4

使用されるスレッドごとに 1 回インスタンス化されるシングルトン クラスを作成したいと思います。インスタンス ポインターを TLS スロットに格納したいと考えています。私は次の解決策を考え出しましたが、スレッド ローカル ストレージが関係している場合に、singelton ファクトリへのマルチスレッド アクセスに関する特別な考慮事項があるかどうかはわかりません。スレッド ローカル シングルトンを実装するためのより良い解決策もあるかもしれません。

class ThreadLocalSingleton 
{
    static DWORD tlsIndex;
public:
    static ThreadLocalSingleton *getInstance()
    {
        ThreadLocalSingleton *instance = 
            static_cast<ThreadLocalSingleton*>(TlsGetValue(tlsIndex));
        if (!instance) {
            instance = new ThreadLocalSingleton();
            TlsSetValue(tlsIndex, instance);
        }
        return instance;
    }
};
DWORD ThreadLocalSingleton::tlsIndex = TlsAlloc();

Tls* 関数はもちろん win32 固有ですが、ここでは移植性は主な問題ではありません。他のプラットフォームに関するあなたの考えは、依然として価値があります。

主な編集:私はもともと、このシナリオで二重チェックのロックを使用することについて尋ねていました. ただし、DavidKが指摘したように、シングルトンはスレッドごとに作成する必要があります。

残りの 2 つの質問は次のとおりです。

  1. TlsGetValue/TlsSetValue で応答して、各スレッドが 1 つのインスタンスを取得し、インスタンスがスレッドごとに 1 回だけ作成されるようにすることは適切ですか?

  2. そのスレッドが終了したときに特定のスレッドに関連付けられたインスタンスをクリーンアップできるようにするコールバックを登録することは可能ですか?

4

3 に答える 3

4

このペーパーを参照して、ダブルチェック ロックが一般的に機能しない理由を理解してください(特殊なケースでは機能する可能性がありますが)。

于 2009-08-04T10:08:14.977 に答える