2010-03-03 7 views
12

오늘 멀티 스레드 환경에서 정적 멤버 함수에 관한 문제가 발생했습니다. 우리가 스스로에게 물었고 만족스러운 대답을 찾을 수없는 질문은 다음과 같습니다. 정적 멤버 함수의 정적 varialbes입니까?정적 멤버 함수의 로컬 변수

// header 

class A 
{ 
    static int test(); 
} 

// implementation 
int A::test() 
{ 
    int a = rand(); 
    int b = rand(); 
    int c = a + b; 

    return c; 
} 

두 개의 스레드 모두 A :: test()를 호출한다고 가정 해 보겠습니다. thread 1이 처리하는 동안 스레드 2가 test()에 들어가고 rand()의 새로운 반환 값을 할당하여 a의 값을 변경하거나 두 스레드가 a, b 및 c에 대한 일부 메모리 위치를 조작하는지 여부가 가능합니까? ?

답변

16

아니요. 스택 프레임은 함수의 각 스레드 호출마다 독립적이며 각 스레드는 자체 로컬을 가져옵니다.

1

a, b 및 c의 저장 클래스는 일반적으로 호출 스택에서 의미하는 (암시 적으로) 자동입니다. 예를 들어, 클래스의 정적 멤버와 같은 실제 공유 데이터에 액세스하려면주의해야합니다. 메서드의 서명 (정적 인 것과는 다른 의미입니다)에서 정적 저장소 클래스를 "상속"하지 않습니다 (오버로드 된 키워드가 많은 경우).

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; 

} 
: 여기

이를 보여주는 샘플입니다