2012-02-14 4 views
2

내 질문은 this question의 확장입니다.중첩 된 로컬 클래스의 정적 메서드

원래 질문에서 OP는 정적 함수의 로컬 변수가 데이터 경합으로부터 보호되어야하는지 여부를 묻습니다. 대답은 각 스레드가 자체 스택 프레임을 얻는 것입니다. 정적 함수가있는 중첩 클래스에도 똑같이 적용된다고 가정하는 것이 안전합니까? rand 다음 스레드로부터 안전합니다 (이 경우 잘 모르겠어요) 외부 기능과 중첩 고정 기능이 모두 정상입니다입니다 그래서 만약

// 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

모든 로컬 변수가 스택으로 이동하고 모든 스레드가 별도의 스택을 얻습니다. 정적 함수 이건 중첩 클래스 이건 상관이 없습니다. –

+0

중첩 클래스 (함수 내부에 정의 됨)에 정적 멤버가있을 수 있습니까? static 멤버 변수로 시도했다. 일하지 않았어. – Sharad

+0

@Sharad : 확실하게 ... http://ideone.com/tl8Za – Samaursa

답변

2

외부 someFunc는 자신의 스택 프레임이 있습니다.

+0

'rand'에 관한 좋은 점은 어떤 식 으로든 보호되지 않는 정적 시드 값을 업데이트한다는 것입니다. –

+0

VC에서는 안전합니다. 일반적으로 POSIX는 아닙니다 ('rand_r'을보십시오). –

+0

'rand()'(+1)에 대한 좋은 지적 이겠지만 원래의 질문에서 복사/붙여 넣기 만 했으므로 문제가되지 않습니다. – Samaursa