I have two managers (which are singletons):
- A licenses manager, counting licences tokens when functionalities are used. The destructor of this release all the licences.
- A Python manager, managing calls to Python from C++, it requires a specific license from the licences manager. The destructor calls the licences manager to finalize the license usage.
I suppose the order of destruction of the singleton is undefined. How can I avoid the mismatch at the destruction of the managers? Is it possible?
This is my typical implementation of a singleton:
class Manager : private boost::noncopyable
{
  private:
    struct singleton_deleter { void operator () (Manager* m) { delete m; } };
    friend struct Manager::singleton_deleter;
  private:
    boost::mutex                singleton_mutex;
    boost::shared_ptr<Manager>  singleton_instance;
  public:
    static Manager&  instance()
    {
      if(!(bool)Manager::singleton_instance)
      {
        boost::mutex::scoped_lock lock(Manager::singleton_mutex);
        if(!(bool)Manager::singleton_instance)
          Manager::singleton_mutex.reset(new Manager, Manager::singleton_deleter());
      }
      return *Manager::singleton_instance;
    }
  private:
    Manager() { this->lic = LicManager::instance().getLicense(); }
    ~Manager() { LicManager::instance().releaseLicense(this->lic); }
};
 
     
     
    