静态内存是不是由不同的线程清理?

Posted

技术标签:

【中文标题】静态内存是不是由不同的线程清理?【英文标题】:Is static memory cleaned up by a different thread?静态内存是否由不同的线程清理? 【发布时间】:2014-07-10 12:30:14 【问题描述】:

所以,我的项目中发生的事情如下:

我有一个以通常方式定义的单例:

Singleton* Singleton::getInstance()

  static Singleton instance;
  return &instance;

在它的构造函数中,这个单例对象初始化了一个 CORBA ORB 并开始在一个单独的(增强)线程(包装器)中运行它,类似于:

CorbaController::CorbaController()



CorbaController::~CorbaController()

    if(!CORBA::is_nil(_orb))
        _orb->shutdown(true);


void CorbaController::run()

    _orb->run();


bool CorbaController::initCorba(const std::string& ip, unsigned long port)

    // init CORBA
    // ...

    // let the ORB execute in a dedicated thread since the run operation is blocking
    start();

    return true;

现在破坏 CorbaController 时的正常行为是它在其析构函数中调用 ORB 上的 shutdown,然后 run 方法跳出 orb.run() 并完成单独的线程。然而,这仅在 CorbaController 被显式删除或定义为局部变量或类变量时才有效,然后在某些时候超出范围。 但是,如果我依赖于在程序结束时清理单例的静态变量,则 orb.shutdown() 会死锁,因为 ACE/TAO 库无法在 ORB 关闭时破坏某些对象上的信号量。

有人知道这里可能存在什么问题吗?这可能是一个线程问题,即构造单例的线程(并且还运行我的应用程序的主要功能)与清理静态内存实例的线程不同?

【问题讨论】:

【参考方案1】:

您必须在应用程序定期关闭期间关闭并销毁 ORB,在静态对象的析构函数中执行此操作确实为时已晚。向您的 CORBA 控制器添加一个 shutdown() 方法,该方法会关闭和销毁 ORB。

【讨论】:

以上是关于静态内存是不是由不同的线程清理?的主要内容,如果未能解决你的问题,请参考以下文章

静态方法内存分配

同一线程中类的所有实例中的类的共享数据成员

LeakCanary检测内存泄漏

堆栈方法区直接内存

地址清理程序在静态转换无效指针时报告错误

Android内存重启之静态变量被回收导致nullPoint问题