Функция SetLongevity от Loki мне кажется небезопасной, так? - PullRequest
0 голосов
/ 22 июля 2011

Существует глобальная переменная pTrackerArray, которая используется в функции Loki SetLongevity.

Объявление 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
    ...
}

Безопасно ли использовать pTrackerArray как таковой в SetLongevity как таковом?

1 Ответ

1 голос
/ 22 июля 2011

Как показано, очевидно, нет.Однако, если я правильно читаю оставшуюся часть этого файла, SetLongevity, в конечном счете, вызывается только изнутри функции, которая сама должным образом обернута в мьютекс [при условии, что вы просили, чтобы синглтон был поточно-ориентированным, очевидно]. Так что, хотя у этой конкретной функции есть проблемы, ее использование все еще совершенно безопасно.

Однако мьютекс, который они создают в этой базовой функции, параметризуется в зависимости от типа создаваемого вами синглтона, в то время какГлобальный указатель является общим для всех синглетонов.Так что да, похоже, что два разных объекта Singleton в двух разных потоках могут одновременно обращаться к этой функции, вызывая хаос.

...