让 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

Loki 配置与 s3

Loki生产环境集群方案

Grafana v9.0正式发布-推出Prometheus和Loki可视化查询构建器

如何在 VS 2013 中为 200 个用户运行 Web 性能测试?