C++ C++;论单身

C++ C++;论单身,c++,multithreading,singleton,mutex,C++,Multithreading,Singleton,Mutex,我有一个singleton类,我确信singleton的第一个调用只由一个线程完成。我已经用延迟初始化实现了singleton。 现在我有了另一个工厂类,它负责在单个线程环境中创建所有单例。 singleton可以从多个线程中使用,并且方法受到互斥的保护。 第一个问题 这种方法可以接受吗 第二个问题 我有一个复杂的类,它必须是线程安全的此类必须是单例。如何证明调用类的不同方法是线程安全的。例如 我怎么能得到这个 第二个问题的答案是: class MyProtectedSingleton

我有一个singleton类,我确信singleton的第一个调用只由一个线程完成。我已经用延迟初始化实现了singleton。

现在我有了另一个工厂类,它负责在单个线程环境中创建所有单例。 singleton可以从多个线程中使用,并且方法受到互斥的保护。

第一个问题

这种方法可以接受吗

第二个问题

我有一个复杂的类,它必须是线程安全的
此类必须是单例。如何证明调用类的不同方法是线程安全的。例如


我怎么能得到这个

第二个问题的答案是:

class MyProtectedSingleton: public MySingleton
{
public:
   void f1()
   {
       MySingletonLock lock;
            // Other thread must wait here.
       MySingleton::instance().f1();    
   }

  void f2()
  {
      MySingletonLock lock;
        // Other thread must wait here.
      MySingleton::instance().f2();    
  }
};

通过MyProtectedSingleton中的包装器调用f1、f2等。第二个问题的答案是:

class MyProtectedSingleton: public MySingleton
{
public:
   void f1()
   {
       MySingletonLock lock;
            // Other thread must wait here.
       MySingleton::instance().f1();    
   }

  void f2()
  {
      MySingletonLock lock;
        // Other thread must wait here.
      MySingleton::instance().f2();    
  }
};

通过MyProtectedSingleton中的包装调用f1、f2等。

为什么有一个创建Singleton的工厂?听起来很混乱。单身是永远不能接受的。不要使用单例,这是一个非常糟糕的模式。另外,您无法阻止一个实例,您的类有一个公共默认构造函数,因此任何人都可以创建更多实例。在不阻止多个实例的情况下,您所拥有的只是GlobalState模式,这是一种纯粹的模式。帮你自己一个忙,现在就改变你的设计。没错Jonathan..就像你有类和实例一样,但是让我们也创建一个全局的。加上singleton是非常无线程安全的!另外,定义“线程安全”。以什么方式安全?什么使用模式?防止意外误用?对意志坚定、怀有恶意的白痴安全吗?埃尔维斯,这种做法违背了“懒惰初始化”的目的@maverik说,“单身是邪恶的”这一观点在全球范围内绝非公认。另一种选择是,您可以有一个带有函数的名称空间,并且在实现中有静态全局变量(仅在该转换单元中可见);函数将是这些变量的接口。为什么有一个创建单例的工厂?听起来很混乱。单身是永远不能接受的。不要使用单例,这是一个非常糟糕的模式。另外,您无法阻止一个实例,您的类有一个公共默认构造函数,因此任何人都可以创建更多实例。在不阻止多个实例的情况下,您所拥有的只是GlobalState模式,这是一种纯粹的模式。帮你自己一个忙,现在就改变你的设计。没错Jonathan..就像你有类和实例一样,但是让我们也创建一个全局的。加上singleton是非常无线程安全的!另外,定义“线程安全”。以什么方式安全?什么使用模式?防止意外误用?对意志坚定、怀有恶意的白痴安全吗?埃尔维斯,这种做法违背了“懒惰初始化”的目的@maverik说,“单身是邪恶的”这一观点在全球范围内绝非公认。另一种选择是,您可以有一个带有函数的名称空间,并且在实现中有静态全局变量(仅在该转换单元中可见);这些函数将是这些变量的接口。这仅保护f1()的调用。。。我希望f1()f2()的调用。。。就像是“原子”你现在有f2保护:D你能有多少功能?内联功能几乎没有任何成本。(小调)您编写了“accetable”,但我无法编辑您的问题,因为有这么一个小错误。请注意,如果您说“f2运行时线程不能执行f1”,则用于保护f1、f2等的锁对象应该是singleton类的成员。限制性较小的选项是每个函数有一个锁对象,如果使用c++11(我认为是VS2012和g++4.7),它可以是一个静态局部变量,因为标准现在保证静态局部变量在使用之前完全初始化。您可以在MySingleton中使f1、f2等
受保护。对于单线程情况,锁可以为空(不执行任何操作)。这只保护f1()的调用。。。我希望f1()f2()的调用。。。就像是“原子”你现在有f2保护:D你能有多少功能?内联功能几乎没有任何成本。(小调)您编写了“accetable”,但我无法编辑您的问题,因为有这么一个小错误。请注意,如果您说“f2运行时线程不能执行f1”,则用于保护f1、f2等的锁对象应该是singleton类的成员。限制性较小的选项是每个函数有一个锁对象,如果使用c++11(我认为是VS2012和g++4.7),它可以是一个静态局部变量,因为标准现在保证静态局部变量在使用之前完全初始化。您可以在MySingleton中使f1、f2等
受保护。对于单线程情况,锁可以是空的(不执行任何操作)。
class MyProtectedSingleton: public MySingleton
{
public:
   void f1()
   {
       MySingletonLock lock;
            // Other thread must wait here.
       MySingleton::instance().f1();    
   }

  void f2()
  {
      MySingletonLock lock;
        // Other thread must wait here.
      MySingleton::instance().f2();    
  }
};