使用 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&
。
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&
。