2010-03-03 87 views
12

今天我们在多线程环境中讨论了有关静态成员函数的问题。我们问自己并且找不到令人满意的答案的问题是: 也是静态成员函数的局部变量static?静态成员函数的局部变量

// 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,b和c的一些内存位置来更改值a

回答

16

不可以。堆栈帧对于每个线程调用该函数都是独立的,并且每个线程都获得它自己的本地。 (如果你正在访问实际的共享数据,例如类中的静态成员,你需要小心。)

1

a,b和c的存储类是(隐含地)auto,通常表示调用堆栈。它们不会从方法签名中“继承”静态存储类(这是静态的不同含义(对于严重超载的关键字而言)。

2

除非显式声明为静态,否则它们不是。他们在堆栈中,每个线程都有一个单独的堆栈。

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; 

}