让 Loki Singleton 在 VS 2008 C++ 的 DLL 中工作
Posted
技术标签:
【中文标题】让 Loki Singleton 在 VS 2008 C++ 的 DLL 中工作【英文标题】:Getting Loki Singleton to work in DLLs in VS 2008 C++ 【发布时间】:2010-11-03 16:51:31 【问题描述】:我很确定这个问题不是新问题,而且很确定它很难解决。希望我对后者的看法是错误的。
我正在尝试在我的程序中使用 Modern C++ Design 中的 Loki::Singleton。
但是,我似乎无法让它跨 DLL 工作。我想我知道为什么会发生这种情况:模板化代码在每个源模块中都被实例化,因此每个模块都有自己的全局变量,而不是一个全局变量。
显然,这使得 Singleton 非常不单一。
有什么办法可以避免这种行为吗?
【问题讨论】:
【参考方案1】:您可能是正确的,每个 DLL 都有自己的单例实例。我对 Loki 的实现不是很熟悉,source code 也不是很有趣。
可能的解决方案是:
不使用单例。这实际上是我通常的偏好,因为您可以通过将设计更改为不需要它们来避免整类问题。关于单身人士为何有害的长篇大论,请参阅this Yegge 帖子。我并没有那么强烈地反对他们,但 95% 的情况下,单身人士造成的问题比他们解决的问题多得多(如果他们真的解决了任何问题) 跨 DLL 边界复制静态成员。我也将其作为一种 hack 来完成,其中 DLL 从应用程序或另一个 DLL 获取指针,并将其自己的静态类成员副本重置为从外部传递的指针。它很邪恶,很脏,你无法清理它,但它确实有效。【讨论】:
【参考方案2】:请注意,这不会解决问题。显式实例化和导出的单例应该可以解决问题...
-瑞克
检查#pragma data_seg here 基本上,您需要在代码的共享部分中声明单例的实例。默认情况下,静态变量的作用域是 dll。
使用模板可能会变得棘手,但这是成功之路,不涉及传递/复制静态数据。
【讨论】:
这似乎不是我想要的。使用#pragma data_seg 允许我在程序之间共享数据。我遇到的问题是在 DLL 之间共享。实际上,您指向的页面上的限制明确指出“每个进程都有自己的地址空间。指针永远不会存储在共享数据段中包含的变量中,这一点非常重要。指针可能在一个应用程序中完全有效但不是在另一个。” Singleton 在内部使用指针。【参考方案3】:我在 Loki 源目录中看到他们有一个特定的 SingletonDLL directory 正在测试中,看起来他们使用了一个导出的、显式实例化的模板(这会起作用)。希望其中包含您想要的代码。
【讨论】:
谢谢,托德!这似乎有效,我发现了这个KB article,它深入解释了 SingletonDll(在 Loki 中)的示例代码在做什么。正常工作很痛苦(使用所有 declspecs 等),它仍然给我留下 m_tick_file = Tick_File_Factory::Instance ().CreateObject ("OHLC_File")); 之类的代码。在我的应用程序中。我想我最终可能会向 Tick_File 添加静态成员函数,它在内部使用 Loki 的东西,然后我知道模板只在 Tick_File 的 .cpp 中被安装一次以上是关于让 Loki Singleton 在 VS 2008 C++ 的 DLL 中工作的主要内容,如果未能解决你的问题,请参考以下文章
区别:@SessionScoped vs @Stateful 和 @ApplicationScoped vs @Singleton [关闭]
Singleton lazy vs eager instantiation