使用这样的伪代码:
class FooBar {
public:
int property;
static int m_static;
}
FooBar instance1 = new FooBar();
FooBar instance2 = new FooBar();
如果我设置了instance1的属性,它显然不会影响第二个属性。但是,如果我改为设置静态属性,则更改应传播到类的每个实例。
如果instance1和2在不同的线程中,这也会发生吗?
答案 0 :(得分:9)
static
成员本质上是绑定到类(不是实例!)的全局变量。全局变量不线程局部,因此对该变量的更改将反映在所有线程中。
(顺便说一句,C ++ 98没有线程的概念。在C ++ 0x中你可以使用
使其成为线程局部的(通过§9.4.2/ 1)static thread_local int static_property;
但这是not widely supported。)
答案 1 :(得分:2)
是的,程序中只有一个FooBar::static
变量实例。当然,从线程访问相同的变量本质上是危险的。
实例根本不重要,您也可以从外部类实例访问(公共)静态成员。
注意:如上所述,由于您不能使用“static”作为变量的名称,因此无法编译,这是一个保留字。
答案 2 :(得分:0)
只有一个静态类变量的副本,它由类的所有对象共享,并且必须同步对它的访问,因为它不是线程安全的。