c++ - Loki 的 SetLongevity 函数对我来说似乎不安全,是这样吗?

标签 c++ multithreading singleton loki

有一个名为“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/

相关文章:

c++ - 预先设置 vector 的大小是否更有效?

c++ - 是否可以在模板类中编写一个静态可变参数模板函数,该函数可以采用 T 类型的 N 个参数?

c++ - 将 auto 作为参数传递(用于指向对象的指针)

C# - 为什么在引用类常量时执行流向实例变量?

ios 单例类使我的应用程序崩溃

c++ - 对话框销毁时触发的一般消息/功能?

Java 多线程。如何停止线程并释放启动器?

c - free() 内存错误

javascript - 如何在 worker 中处理三个网眼对象

Java单例模式在多线程中输出两个相同的对象?