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

发布于 2024-11-26 05:55:17 字数 641 浏览 5 评论 0原文

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

There is a global variable called "pTrackerArray", which is used in Loki's SetLongevity function.

Declaration of pTrackerArray:

typedef std::list<LifetimeTracker*> TrackerArray;
extern LOKI_EXPORT TrackerArray* pTrackerArray;

Definition of 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
    ...
}

Is it thread safe to use pTrackerArray as such in SetLongevity?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

爱的十字路口 2024-12-03 05:55:17

如图所示,显然不是。然而,如果我正确地阅读了该文件的其余部分,SetLongevity 最终只会从本身正确包装在互斥体中的函数内调用[前提是您请求单例是线程的显然是安全的]。 因此,虽然该特定函数存在问题,但它的使用仍然是完全安全的。

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

As shown, obviously not. However, if I am reading the rest of that file correctly, SetLongevity is, ultimately, only ever called from within a function that is itself properly wrapped in a mutex [provided you requested that the singleton be thread-safe, obviously]. So while that particular function has issues, its use is still perfectly safe.

However, the mutex they create in that base function is paramaterized on the type of singleton you are creating, while that global pointer is shared between all singletons. So yes, it does appear as though two different Singleton objects in two different threads could both access that function at once, causing havok.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文