0

我在多线程环境中创建一个单例类,任何线程都可以删除单例对象。我想保护这个。我在某处阅读以避免这个问题,我们可以将析构函数设为私有并提供销毁方法..我们该怎么做?示例代码将有所帮助..

提前致谢。

4

3 回答 3

4
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);
}
于 2012-04-17T05:42:35.690 回答
3

线程确实不利于这种设计,特别是如果你想要一个纯单例。你可以像这样可视化它:

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();
};

但这也应该暗示许多带有纯单例的线程危险信号。

如果您真的想扩展它并强制执行纯单例,您将需要适当的引用计数容器——这表明单例在多个方面都不是解决此问题的一个坏解决方案,并且只会增加大量不必要的复杂性。祝你好运!

于 2012-04-17T05:48:29.057 回答
1

将析构函数设为私有,并提供一个 Destroyer 类,负责销毁和清理 Singleton 的所有内存。它需要成为 Singleton 类的朋友。除此之外,你确定你绝对需要一个单身人士吗?或者这是另一个过度使用的场景?

于 2012-04-17T05:35:20.507 回答