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



那么,在我的项目中发生的事情是这样的:

我有一个单例,它是按通常的方式定义的:

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。

相关内容

  • 没有找到相关文章

最新更新