有一个名为“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
最终只会从本身正确包装在互斥锁中的函数中调用 [前提是您要求单例是线程-安全,显然]。 因此,尽管该特定功能存在问题,但它的使用仍然非常安全。
但是,他们在该基函数中创建的互斥锁根据您正在创建的单例类型进行参数化,而该全局指针在所有单例之间共享。所以是的,看起来确实好像两个不同线程中的两个不同单例对象都可以同时访问该函数,从而导致破坏。
关于c++ - Loki 的 SetLongevity 函数对我来说似乎不安全,是这样吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784987/