这种创建静态实例线程的方法是否安全?

Nav*_*een 6 c++ static-members thread-safety

我有以下示例C++代码:

class Factory
{
public:
    static Factory& createInstance()
    {
        static Factory fac;
        return fac;
    }

private:
    Factory() 
    {
        //Does something non-trivial
    }
};
Run Code Online (Sandbox Code Playgroud)

让我们假设createInstance两个线程同时调用它.那么生成的对象是否会正确创建?如果第二个线程createInstance在第一个线程位于构造函数中时进入调用会发生什么Factory

Mat*_* M. 7

C++ 11及更高版本:本地静态创建是线程安全的.

该标准保证:

  • 创建是同步的.
  • 如果创建抛出异常,则下次执行流程通过变量定义点时,将再次尝试创建.

它通常用双重检查实现:

  • 首先检查线程局部标志,如果设置,则访问该变量.
  • 如果尚未设置,则采用更昂贵的同步路径,如果之后创建变量,则设置线程局部标志.

C++ 03和C++ 98:标准没有线程.

就标准而言,没有线程,因此标准中没有关于跨线程同步的规定.

然而,一些编译器实现比标准规定,无论是在扩展的形式或通过给予更有力的保护,因此,请检查您感兴趣的编译器.如果他们是那些质量好,有机会,他们就会保证.

最后,它可能没有必要是线程安全的.如果创建任何线程之前调用此方法,那么您可以确保在真正的多线程发挥作用之前将其正确初始化,并且您可以巧妙地解决问题.

  • @tangy:谢谢您的通知;我有很多答案,我只是无法检查它们是否都是最新的,所以当我收到 ping 时它非常有用:) (2认同)