访问共享库中定义的单例

时间:2013-01-30 15:26:01

标签: c++ singleton shared-libraries

让我们假设我有以下架构:

  • Dodo libdodo
  • 中的单身课程
  • 主程序已关联libdodolibponny;主程序称为Dodo::instance()
  • 创建了来自Ponny
  • libponny课程。它有Dodo singleton
  • 的标题

mainwindow.cpp

    #include "shared/dodo/dodo.h"
    // ...
    Dodo::instance()->setNumber(91);

然后,在此调用之后,创建了Ponny class(ponny.cpp)

ponny.cpp

    #include "shared/dodo/dodo.h"
    // ...
    bool is = (Dodo::instance()->number() == 91);
    // Will `is` be true?

那么,我可以这样做吗?

2 个答案:

答案 0 :(得分:3)

由于单例行为的定义位于其库中,这意味着单例实例将是唯一的,并且它将存在于创建它的编译单元中。

让我们说libdodo Dodo.cppstatic Dodo& Dodo::instance() { static Dodo dodo; return dodo; } ,你有:

Dodo::instance

请注意,本地静态变量在第一次执行到达声明时被初始化,所以在这种情况下第一次调用Dodo::instance()时,所以很可能你不会遇到任何问题像这样的懒惰初始化单身。

在这里扮演角色的唯一事实是线程安全,因为当更多线程第一次调用{{1}}时可能存在竞争条件。有关更多信息,我建议您阅读:
这个问题:Singleton & Multi-threading
这篇文章:C++ scoped static initialization is not thread-safe, on purpose!
这个问题也可以帮到你:Thread safe lazy construction of a singleton in C++


另请注意,在C ++ 11(§6.7.4)中,静态变量的初始化保证是线程安全的:

  

如果控件在初始化变量时同时进入声明,则并发执行应等待初始化完成。

这意味着像这样的延迟初始化变得有点防弹;)

答案 1 :(得分:1)

单例实例是全局的。 Globals可以在DLL /共享对象边界之间共享,如果这正是您所要求的。

您还需要了解One Definition Rule,它确保该类只有一个定义,因此该类中的任何静态成员只有一个实例。