[英]local variables of static member functions
今天,我們遇到了一個涉及多線程環境中靜態成員函數的問題。 我們問自己並且找不到令人滿意的答案的問題是:靜態成員函數的局部變量是否也是靜態的?
// 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,b和c的存儲類是(隱式)auto,通常意味着在調用堆棧上。 它們不會從方法簽名中“繼承”靜態存儲類(這是靜態的不同含義(對於嚴重超載的關鍵字而言是yay)!)。
不,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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.