2010-03-03 86 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; 

}