【问题标题】:Loki's SetLongevity function seems unsafe to me, is that so?Loki 的 SetLongevity 函数对我来说似乎不安全,是这样吗?
【发布时间】:2011-10-10 17:30:42
【问题描述】:

有一个名为“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 是否是线程安全的?

【问题讨论】:

    标签: c++ multithreading singleton loki


    【解决方案1】:

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

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

    【讨论】:

    • 感谢您的回答。但我认为它只适合您的描述,只要我们在多个线程中使用相同的 Singleton::Instance 方法。当我们有几个单例类并且每个类中的 Instance() 方法在不同的线程中运行时会怎样?当他们到达 SetLongevity 时,那里还安全吗?
    • 嗯,你说得对,我没有仔细研究最后一个函数。除非我遗漏了什么,否则它确实似乎只保护给定的单例。
    猜你喜欢
    • 2011-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多