2012-02-14 86 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