0

Loki の SetLongevity 関数で使用される「pTrackerArray」というグローバル変数があります。

pTrackerArray の宣言:

typedef std::list<LifetimeTracker*> TrackerArray;
extern LOKI_EXPORT TrackerArray* pTrackerArray;

SetLongevity の定義:

template <typename T, typename Destroyer>
void SetLongevity(T* pDynObject, unsigned int longevity, Destroyer d)
{
    using namespace Private;

    // manage lifetime of stack manually
    if(pTrackerArray==0)
        pTrackerArray = new TrackerArray;

    // For simplicity, the rest of code is omitted
    ...
}

SetLongevity で pTrackerArray をそのまま使用するのはスレッドセーフですか?

4

1 に答える 1

1

示されているように、明らかにそうではありません。ただし、そのファイルの残りの部分を正しく読んでいる場合SetLongevity、最終的には、それ自体がミューテックスで適切にラップされている関数内からのみ呼び出されることがあります[明らかに、シングルトンがスレッドセーフであることを要求した場合]。 したがって、その特定の機能には問題がありますが、その使用は依然として完全に安全です。

ただし、その基本関数で作成されるミューテックスは、作成するシングルトンのタイプでパラメーター化されますが、そのグローバル ポインターはすべてのシングルトン間で共有されます。そうです、2 つの異なるスレッドにある 2 つの異なる Singleton オブジェクトの両方が一度にその関数にアクセスでき、混乱を引き起こしているように見えます。

于 2011-07-22T04:17:20.697 に答える