2011-06-12 4 views
15

그 질문은 중복으로 보일 수 있지만 다른 질문을 읽지는 못했습니다.C++ 다중 스레드 안전 로컬 변수?

내 상황 - Visual C++ 컴파일러 2005 Express Edition Studio + Windows sdk.

같은 함수 경우 그냥 질문 :

void myFunc() 
{ 
    int i=0; 
    i++; 
} 

안전 여러 스레드에서 호출?

그래, 그렇긴하지만 컴파일러는 i 변수를 메모리에서 정적으로 만들지 않을 것입니까? 그래서 두 스레드가 하나의 메모리 영역에서 함께 작동한다는 결과를 낳을 수 있습니까? 아니면 내 두려움은 바보에 대한 몇 가지 두려움일까요? 그리고 모든 지역 변수는 함수를 호출하는 순간 생성됩니까?

답변

23

예, 스레드로부터 안전합니다.

i은 정적이 아니기 때문에 메모리에 고정되지 않습니다. 경우는, 다른 한편으로는, 당신이 쓴 :

void myFunc() 
{ 
    static int i = 0; 
    i++; 
} 

그런 다음이 스레드 안전되지 않을 것이다 (물론, i가 실제로 사용 된 경우).

로컬 변수는 모두 스택에 있거나 전체 레지스터에 있습니다. 각 스레드는 자체적 인 스택을 가지고 있으며, 레지스터는 본질적으로 각 스레드에 로컬하게 처리되므로 (Context Switching 참조) 괜찮습니다.

+0

감사합니다. Peter Alexander! – Evengard

5

컴파일러는 변수를 정적으로 만들 수 없으므로 프로그램의 의미가 변경됩니다. 스택에만 선언 된 변수를 사용한다면 스레드 안전성을 보장 할 수 있습니다.

1

@PeterAlexander가 아마도 당신이 걱정하는 경우에 대답했을지 모르지만, 그렇지 않은 경우는 i이 전역 변수였습니다.

7

그리고 모든 로컬 변수는 함수를 호출 할 때 생성됩니까?

로컬 변수의 일반적인 구현은 스택에 만들고 각 스레드는 자체 스택을 가지고 있으므로 지역 변수가 좋습니다.

가변 데이터가 정적 데이터 또는 전역 데이터에서 작동하는 논리를 가질 수 있으므로 변수가 복잡한 유형 인 경우에만주의해야합니다. 대부분의 좋은 소프트웨어는 그런 수업을 쓰는 것을 피할 것입니다.