静态内存是不是由不同的线程清理?
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。
【讨论】:
以上是关于静态内存是不是由不同的线程清理?的主要内容,如果未能解决你的问题,请参考以下文章