洛基的长寿功能对我来说似乎不安全,是这样吗?
Loki's SetLongevity function seems unsafe to me, is that so?
有一个名为"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。
相关文章:
- 有人能解释一下为什么下界是这样工作的吗C++的
- 我适合在我的构建系统中使用 shell 脚本而不是AX_CHECK_COMPILE_FLAG吗?
- C++我们可以取消引用此指针吗?如果是这样,那么如何,如果不是,那为什么?
- 将类成员函数的模板定义放在 CPP 文件中C++隐式实例化而不是 .H 允许吗?
- 打印空指针时,std::cout 可以打印 "NULL" 而不是 0 吗?
- C++ 互斥锁可以交叉方法/变量吗?如果是这样,为什么在这里不起作用?
- 在这种情况下,我们可以使用静态而不是朋友吗,还有其他解决方案是什么
- 将 NULL 转换为长不是模棱两可吗?
- 我可以在C++中返回跨度吗?如果是这样,如何?(对替代方案开放
- caffe 可以一次接收一批具有不同分辨率的输入吗?如果是这样,怎么办?
- 如果不是这样,我需要帮助理解这个嵌套的问题
- 解决方法:QPixmap:在GUI线程之外使用pixmap是不安全的
- 如果绝对没有调用成员函数,是否允许使用不完整类型的向量?如果是这样,从什么时候开始
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- 我似乎无法将MS泄漏检测器用于新表达式“new(std::nothrow)”.是这样吗
- 如果我的CPU负载表明不是这样,我应该启动多个线程吗
- 在同一个vtkSmartPointer上调用new两次是不安全的吗?
- 洛基的长寿功能对我来说似乎不安全,是这样吗?
- 在C++类中,成员通常不应该是常量吗?const成员的实际目的
- C++的默认复制构造函数本质上是不安全的吗?迭代器从根本上也是不安全的吗?