2012-02-14 100 views
2

我的問題是對this question的擴展。嵌套本地類的靜態方法

在原始問題中,OP詢問是否需要對數據競爭保護靜態函數的局部變量。答案是每個線程都有自己的堆棧框架。假設這同樣適用於具有靜態函數的嵌套類嗎?

// Function called by several threads 
int someFunc(int a, int b) 
{ 
    struct nestedStruct 
    { 
    static int do_something(int& a, int& b) 
    { 
     a = rand(); 
     b = rand(); 
     return a + b; 

    } 
    }; 

    return nestedStruct::do_something(a, b); 
} 
+0

所有局部變量都放在堆棧上,所有線程都得到一個單獨的堆棧。無論是靜態函數還是嵌套類與它無關。 – 2012-02-14 20:49:52

+0

嵌套類(我的意思是定義在一個函數內)有靜態成員呢?我試着用一個靜態成員變量。沒有工作。 – Sharad 2012-02-14 20:55:06

+0

@Sharad:它確實可以... http://ideone.com/tl8Za – Samaursa 2012-02-14 21:02:41

回答

2

someFunc都有自己的堆棧幀,所以如果rand是線程安全的(我不知道這是否是),那麼無論是外部函數和嵌套靜態函數的罰款。

+0

關於'rand'的好處是,它可能會更新一個靜態種子值,它不會以任何方式受到保護。 – 2012-02-14 20:52:31

+0

在VC上是安全的,POSIX一般不會(見'rand_r')。 – 2012-02-14 20:59:47

+0

我同意,關於'rand()'(+1)的好處,但這只是原始問題的複製/粘貼,並不是問題的關鍵。 – Samaursa 2012-02-14 21:01:00