0

所以,在我的项目中发生的事情如下:

我有一个以通常方式定义的单例:

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 关闭时破坏某些对象上的信号量。

有人知道这里可能存在什么问题吗?这可能是一个线程问题,即构造单例的线程(并且还运行我的应用程序的主要功能)与清理静态内存实例的线程不同吗?

4

1 回答 1

0

您必须在应用程序定期关闭期间关闭并销毁 ORB,在静态对象的析构函数中执行此操作确实为时已晚。向您的 CORBA 控制器添加一个shutdown() 方法,该方法执行关闭和销毁 ORB。

于 2014-08-01T10:50:06.487 回答