所以,在我的项目中发生的事情如下:
我有一个以通常方式定义的单例:
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 关闭时破坏某些对象上的信号量。
有人知道这里可能存在什么问题吗?这可能是一个线程问题,即构造单例的线程(并且还运行我的应用程序的主要功能)与清理静态内存实例的线程不同吗?