洛基的长寿功能对我来说似乎不安全,是这样吗?

Loki's SetLongevity function seems unsafe to me, is that so?

本文关键字:不安全 是这样吗 对我来说 功能 洛基      更新时间:2023-10-16

有一个名为"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
    ...
}
在SetLongevity中使用pTrackerArray是线程安全的吗?

如图所示,显然不是。但是,如果我正确地读取了该文件的其余部分,那么SetLongevity最终只会从本身正确地包装在互斥锁中的函数中调用[前提是您要求单例显然是线程安全的]。

然而,他们在基函数中创建的互斥锁是根据你创建的单例类型参数化的,而全局指针在所有单例之间共享。所以,是的,看起来好像两个不同线程中的两个不同的Singleton对象可以同时访问该函数,从而导致havok。

相关文章: