C++ 洛基';对我来说,设置长寿功能似乎不安全,是吗?

C++ 洛基';对我来说,设置长寿功能似乎不安全,是吗?,c++,multithreading,singleton,loki,C++,Multithreading,Singleton,Loki,有一个名为“ptrackeraray”的全局变量,它用于Loki的setLongtime函数中 许可证声明: typedef std::list<LifetimeTracker*> TrackerArray; extern LOKI_EXPORT TrackerArray* pTrackerArray; typedef std::list trackerray; extern LOKI_EXPORT TrackerArray*pTrackerArray; 寿命的定义: templ

有一个名为“ptrackeraray”的全局变量,它用于Loki的setLongtime函数中

许可证声明:

typedef std::list<LifetimeTracker*> TrackerArray;
extern LOKI_EXPORT TrackerArray* pTrackerArray;
typedef std::list trackerray;
extern LOKI_EXPORT TrackerArray*pTrackerArray;
寿命的定义:

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
    ...
}
模板
void setlongest(T*pDynObject,unsigned int longest,destructor d)
{
使用私有名称空间;
//手动管理堆栈的生存期
如果(ptrackraray==0)
ptrackrarray=新轨道阵列;
//为简单起见,省略了代码的其余部分
...
}

在setLonelopy中使用ptrackray这样的线程安全吗?

如图所示,显然不安全。但是,如果我正确地读取了该文件的其余部分,
setlongibility
最终只能从一个本身正确包装在互斥锁中的函数中调用(前提是您要求单例是线程安全的)。因此,尽管该特定函数存在问题,但其使用仍然是完全安全的


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

谢谢您的回答。但我认为,只要我们在多个线程中使用相同的Singleton::Instance方法,它就符合您的描述。当我们有几个单例类,并且每个类中的Instance()方法在不同的线程中运行时会怎么样?当它们到达SETLONGTHE时,它在那里仍然安全吗?嗯,你是对的,我没有仔细查看最后一个函数。除非我遗漏了什么,否则它肯定只会保护特定的单身汉。