今天我们遇到了一个涉及多线程环境中静态成员函数的问题。我们问自己但无法找到令人满意的答案的问题是: 静态成员函数的局部变量也是静态的吗?
// header
class A
{
static int test();
}
// implementation
int A::test()
{
int a = rand();
int b = rand();
int c = a + b;
return c;
}
假设您有两个线程都调用A :: test()。是否有可能当线程1进程c = a + b
线程2进入test()并通过分配rand()的新返回值来更改a
的值,或者换句话说,两个线程都运行一些线程a,b和c的内存位置?
答案 0 :(得分:18)
没有。堆栈帧对于每个线程调用函数是独立的,并且每个都有自己的本地。 (如果您正在访问实际的共享数据,例如类中的静态成员,则需要小心。)
答案 1 :(得分:2)
除非明确声明为静态,否则不是。它们位于堆栈上,每个线程都有一个单独的堆栈。
答案 2 :(得分:1)
a,b和c的存储类是(隐式)auto,通常意味着在调用堆栈上。它们不会从方法签名中“继承”静态存储类(这是静态的不同含义(对于严重超载的关键字而言是yay!)。
答案 3 :(得分:0)
不,a,b和c不是静态的。
以下是一个说明这一点的示例:
class Val
{
public:
Val() { cout << "Val" << this << endl; }
~Val() { cout << "~Val" << this << endl; }
int n_;
};
class A
{
public:
static int test()
{
Val a;
a.n_ = rand();
Val b;
b.n_ = rand();
Val c;
c.n_ = a.n_ + b.n_;
return c.n_;
}
};
int main()
{
srand(time(0));
for( int i = 0; i < 5; ++i )
{
cout << "Test = " << A::test() << endl;
}
return 0;
}