我在多线程环境中创建一个单例类,任何线程都可以删除单例对象。我想保护这个。我在某处阅读以避免这个问题,我们可以将析构函数设为私有并提供销毁方法..我们该怎么做?示例代码将有所帮助..
提前致谢。
我在多线程环境中创建一个单例类,任何线程都可以删除单例对象。我想保护这个。我在某处阅读以避免这个问题,我们可以将析构函数设为私有并提供销毁方法..我们该怎么做?示例代码将有所帮助..
提前致谢。
class Singleton; // forward declaration
Singleton * s = NULL; // global object available to all threads
// Place this class in a location unavailable to all threads except Main thread
class ManageSingleton
{
public:
static void DestroySingleton(Singleton * s)
{
delete s;
}
}
class Singleton
{
friend class ManageSingleton;
protected:
~Singleton() {}
};
void main()
{
s = new Singleton;
while (...)
{
// other threads access Singleton object until program is finished
}
// Program is now finished; destroy Singleton object
ManageSingleton::DestroySingleton(s);
}
线程确实不利于这种设计,特别是如果你想要一个纯单例。你可以像这样可视化它:
class t_singleton {
public:
static t_singleton& Get() {
/* thread safety is a consideration here: */
t_auto_ptr<t_singleton>& shared(Shared());
if (shared.isNull()) {
shared.setObject(new t_singleton);
}
/* and you should manage external references using another container type: */
return Shared().reference();
}
static void DestroyIt() {
/* thread safety is a consideration here: */
Shared().destroy();
}
private:
static t_auto_ptr<t_singleton>& Shared() {
static t_auto_ptr<t_singleton> s_Shared;
return s_Shared;
}
private:
t_singleton();
~t_singleton();
};
但这也应该暗示许多带有纯单例的线程危险信号。
如果您真的想扩展它并强制执行纯单例,您将需要适当的引用计数容器——这表明单例在多个方面都不是解决此问题的一个坏解决方案,并且只会增加大量不必要的复杂性。祝你好运!
将析构函数设为私有,并提供一个 Destroyer 类,负责销毁和清理 Singleton 的所有内存。它需要成为 Singleton 类的朋友。除此之外,你确定你绝对需要一个单身人士吗?或者这是另一个过度使用的场景?