那么,在我的项目中发生的事情是这样的:
我有一个单例,它是按通常的方式定义的:
Singleton* Singleton::getInstance()
{
static Singleton instance;
return &instance;
}
在它的构造函数中,这个单例对象初始化一个CORBA ORB,并开始在一个单独的(boost)线程(包装器)中运行它,类似于:
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;
}
现在,当析构corbaccontroller时的正常行为是,它在析构函数中调用ORB上的shutdown,然后run方法跳出ORB .run()并完成单独的线程。然而,只有当corbaccontroller被显式删除或定义为一个局部或类变量,然后在某个时候超出作用域时,这才有效。如果我依赖于单例的静态变量在程序结束时被清理,那么ORB .shutdown()就会死锁,因为ACE/TAO库无法在一些对象上获取要用ORB关闭来销毁的信号量。
有人知道这里可能有什么问题吗?这可能是一个线程问题,即,线程构造的单例(也运行我的应用程序的主要功能)是不同的线程清理静态内存实例?
必须在应用程序的常规关闭期间关闭和销毁ORB,在静态对象的析构函数中这样做实在太迟了。向CORBA控制器添加一个shutdown()方法,该方法执行关闭和销毁ORB。