Нам не хватает информации, особенно я надеюсь, что мы говорим на C ++ 0x, иначе это будет довольно сложно.
Первое решение - явно управлять вашими синглетами. Большинство проектов, с которыми вы сталкиваетесь в Интернете, ориентированы на простоту и удобство использования за счет правильности в общей ситуации.
Самый простой способ избежать проблем с вашими синглетами в зависимости друг от друга - это создать их экземпляры и освободить их, пока вы все еще однопоточны (чтобы избежать проблем с синхронизацией) и в правильном порядке.
Естественно, за этим следует идея Singleton Manager
, которая является своего рода "супер-синглтоном" и будет создавать экземпляры ваших синглетонов и соответственно их выпускать. Все обращения к синглтону осуществляются через него, чтобы он мог гарантировать, что они доступны при обращении. Еще раз, создание и разрушение происходит в однопоточной ситуации.
Становится намного сложнее, когда мы говорим о отложенной инициализации (по требованию). Наиболее простой схемой для этого является локальная статическая переменная:
MySingleton& Get() { static MySingleton M; return M; }
C ++ 0x, наконец, гарантирует, что будет создан только один экземпляр MySingleton
, что значительно облегчит работу! Однако у вас здесь есть проблема «мертвой ссылки».
В C ++ порядок уничтожения статических объектов просто противоположен порядку построения, поэтому одно из решений состоит в том, чтобы предписать использовать в конструкторах любой синглтон, используемый в деструкторе одноэлементного объекта (ВСЕ из них). Таким образом, вы на самом деле гарантируете, что он будет построен до и, следовательно, разрушен после.
Обратите внимание, что ленивое создание экземпляров сложно в многопоточной среде в C ++ 03 (или раньше), потому что не было никакой гарантии, что будет создан один экземпляр ... и в этот момент чрезвычайно трудно получить блокировку (после все, мьютекс сам по себе одноэлементный ... не так ли?).