静态内存是否由另一个线程清理?

时间:2014-07-10 12:30:15

标签: memory-management boost-thread corba static-initialization tao

所以,我的项目中发生了以下情况:

我有一个以通常方式定义的单身人士:

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关闭。

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

1 个答案:

答案 0 :(得分:0)

你必须在应用程序的常规关闭期间shuytdown并销毁ORB,在静态对象的析构函数中执行它实在太晚了。向CORBA Controller添加一个shutdown()方法,该方法关闭并销毁ORB。