使用 lambda 线程安全创建的静态变量是否?

Is a static variable created using a lambda thread-safe?

    A& instA()
    {
        static A a = []{
              return A();
         }();
         return a;
    }

instA()returns单个静态a;这个函数多线程安全吗?

如评论中所述,实现相同功能的更简单代码是:

A& instA()
{
    static A a;
    return a;
}

从 C++11 开始,这是线程安全的。此函数内不需要互斥量。 a只会被创建一次,不同的线程可以引用它。

但是,请不要误以为以上内容解决了有关 a.

的所有线程问题

两个线程可以做到这一点:

  // thread A
  auto x = instA();

  // thread B
  auto y = instA();

但是一旦有多个线程访问实例并且至少有一个写入,您就需要同步访问。这是不是线程安全的:

  // thread A
  auto x = instA();
  x.foo = 42;

  // thread B
  auto y = instA();
  int y = x.foo;

总结:您的 instA 正在以线程安全的方式创建实例。但是,这并不意味着除了创建实例之外的任何事情都是线程安全的。我建议 return 改为 const A&