使用单例模式的简单C++记录器

shi*_*ing 6 c++ logging singleton design-patterns

由于使用Singleton模式实现记录器的泛滥示例,我刚刚为我的程序编写了一个简单的C++记录器.但是,由于已知着名的双重检查锁定方法不再是线程安全的,我想知道我是否应该:

1)忘记在这种情况下使用Singleton模式?

2)即使不安全,仍继续使用双重检查锁定?

3)对每次访问公共接口使用昂贵的纯同步锁定方法?

有什么建议?

Ark*_*nez 16

使用Meyers Singleton.如果你使用gcc,至少初始化是线程安全的.

class Singleton{
   Singleton(){
    //This is threadsafe in gcc, no mutex required
   }
   static Singleton * instance(){
      static Singleton myinstance;
      return &myinstance;
   }
};
Run Code Online (Sandbox Code Playgroud)

gcc保护静态本地构造除非你用-fno-threadsafe-statics禁用,我最近在这里写了一下

  • 而不是返回`Singleton*`,返回`Singleton&`.它可以防止有人意外地执行以下操作:`Singleton*instance = Singleton :: instance(); ...代码行...删除实例;` (11认同)
  • 它应该是`return&myinstance;`. (2认同)
  • 请不要返回指针.如果你这样做,你会打开一大堆关于谁拥有指针的蠕虫(因此谁应该释放它).通过返回引用,您指示您的代码保留所有权,从而处理销毁.(请注意,在现代C++代码中,您几乎不应该返回RAW指针). (2认同)
  • @PaulManta:因为他们可能认为他们可以删除它.如果您返回引用,则他们现在无法删除.这表明了所有权.这就是为什么你几乎从来没有在GOOD C++代码中传递指针(没有所有权的指示)(除非你仍然用类编写C(是的,那里有很多坏C++)).在C++中,您传递引用或智能指针,因为这些是所有权语义的指示. (2认同)