c++ - 单例死引用问题

标签 c++ multithreading singleton

我阅读了很多关于单例的资料。我在考虑单例之间的死引用问题。在 net 上的每个 primer 中,当一个单例在其析构函数中调用另一个单例时会遇到此问题,并且该单例已经被销毁,例如可以从许多其他单例的析构函数中调用 Log 单例。

我无法想象在其他情况下(除了在 dtr 中引用其他单例),死引用会是一个问题。您能否给我一个存在此类问题的真实示例,我该如何解决?

问题是我需要在我们的项目中实现几个单例,它们都相互通信,我很难选择正确的方式。请不要说不要使用单例,因为那不是我的决定。

最佳答案

销毁顺序问题是单例模式的重要组成部分。

Please do not say not to use a singleton, because that's not my decision.

不使用它们是正确的做法 - 鉴于这是不可能的,您将不得不使用一个 hacky 解决方法。以下是一些可能的解决方案,但没有一个是完美的:

  • 不要在析构函数中引用其他单例
  • 在 main 结束时以正确的顺序显式销毁单例
  • 让您的单例通过 weak_ptr 保存对其他单例的引用 - 它们可以相互独立地销毁,您可以在使用之前安全地检查引用的单例是否仍然存在

此外,我建议不要在多线程上下文中创建或销毁单例 - 确保在任何新线程之前创建所有单例并且在销毁它们之前已停止除主线程之外的所有线程要容易得多。

关于c++ - 单例死引用问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3509763/

相关文章:

singleton - DDD 存储库作为单例?

c++ - 模板化检查是否存在类成员函数?

c++ - 统一构建的好处/坏处?

c++ - 如何在没有Windows API的情况下用Turbo-C++制作一个简单的文本编辑器?

c++ - 如何为嵌套映射分配值

ios - 同时2个定时器

multithreading - 托管 C++ 中的 C# 的 lock()

Python线程和原子操作

javascript - 在Javascript单例中用数组成员初始化对象成员的属性

c# - 每个 HTTP 请求一个类的单个实例