所以,我的项目中发生了以下情况:
我有一个以通常方式定义的单身人士:
Singleton* Singleton::getInstance()
{
static Singleton instance;
return &instance;
}
在它的构造函数中,这个singleton对象初始化一个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;
}
现在破坏CorbaController时的正常行为是它在析构函数中调用ORB上的shutdown,然后run方法跳出orb.run()并完成单独的线程。但是,这仅在CorbaController被显式删除或定义为本地或类变量时才有效,该变量随后会在某个时间点超出范围。 如果我依赖于在程序结束时清理单例的静态变量,orb.shutdown()会死锁,因为ACE / TAO lib无法获取某些对象上的信号量被破坏ORB关闭。
有人知道这里可能出现什么问题吗?这可能是一个线程问题,即构造单例的线程(并且还运行我的应用程序的主函数)与清理静态内存实例的线程不同吗?
答案 0 :(得分:0)
你必须在应用程序的常规关闭期间shuytdown并销毁ORB,在静态对象的析构函数中执行它实在太晚了。向CORBA Controller添加一个shutdown()方法,该方法关闭并销毁ORB。