2017-11-09 7 views
0

그래서 두 개의 스레드가 실행 중이며 각각 동일한 함수를 호출합니다. 나는 경주 상황에 빠지거나 값이 SomeFunction 함수에서 엉망이되었습니다. 나는 각 스레드가 자신의 SomeFunction 사본을 가지지 않을 것이라고 가정한다. 나는 클래스에서 SomeFunction을 넣어 그 같은 함수를 호출 각 스레드의 문제를 해결할 것입니다, 각 스레드에서 새로운 클래스를 생성하고, 따라서 이상 쾅쾅 경우C++ 클래스가 함수 덮어 쓰기를 해결합니까?

DWORD Thread1() { 
INT dwA = 4; 
SomeFunction(dwA); 
} 

DWORD Thread2() { 
INT dwB = 5; 
return SomeFunction(dwB); 
} 

DWORD SomeFunction(DWORD *dwVal) { 
// do some lengthy operations with dwVal here 
return dwVal; 
} 

내 질문은, 대신 위의입니다 SomeFunction()을 전에 호출했을 가능성이있는 다른 thread의 값 이 문제를 피하기 위해 각 스레드가 자체 함수 SomeFunction을 메모리에 가져 왔습니까?

class.h: 
class CDatabase 
{ 
public: 
    CClass(); 
    ~CClass(); 
    DWORD CClass::SomeFunction(DWORD *dwVal); 
}; 


class.cpp 
CClass::CClass() {} 
CClass::~CClass() {} 
DWORD CClass::SomeFunction(DWORD *dwVal) { 
// do some lengthy operations with dwVal here 
return dwVal; 
} 

그리고 각 스레드에 넣었습니까?

DWORD Thread1() { 
INT dwA = 4; 
CClass *m_CDatabase = new CClass(); 
DWORD rv = m_CDatabase->SomeFunction(dwA); 
delete m_CDatabase; 
return rv; 
} 

DWORD Thread2() { 
INT dwA = 5; 
CClass *m_CClass = new CClass(); 
DWORD rv = m_CClass->SomeFunction(dwA); 
delete m_CClass; 
return rv;  
} 

내가 충분히 명확하지 않으면 알려 주시기 바랍니다.

+4

경주 조건과 관련하여 * 아무것도 * 변경되지 않습니다. –

+0

어쩌면 "race"가 내가 사용해야 할 정확한 단어가 아닐지도 모릅니다. – JeffR

+0

모든 경고를 사용하도록 컴파일하고 오류로 처리합니다. 코드 스 니펫 (snippet)이 무엇이든 나타내면 'SomeFunction (& dwA)'와 같은 앰퍼샌드를 잊어 버린 것입니다. – StoryTeller

답변

2

두 스레드가 동일한 코드를 실행합니다 (코드가 공유 됨).

그러나 각 스레드는 고유 한 로컬 변수 집합을 갖습니다. 따라서 스레드는 다른 스레드가 사용하는 변수를 변경하지 않습니다 (변수가 함수에 대해 로컬 인 경우). 이제 변수가 전역이면 모든 베팅이 해제됩니다.

클래스를 사용하도록 변경하면 아무런 영향이 없습니다. 함수의 로컬 변수와 객체의 로컬 변수는 스레드간에 공유되지 않습니다. 그러나 전역 변수는 여전히 공유됩니다.

변수 (로컬 (자동 저장 기간), 전역 (정적 저장 기간) 제외)의 세 번째 유형이 있습니다. 이 세 번째 유형은 스레드 로컬 (스레드 저장 기간)입니다. 이들은 전역 변수와 비슷하지만 함수 나 객체에 국한되지는 않지만 각 스레드는 변수의 자체 복사본을 가지고 있으므로 전역 변수와 상호 작용하지는 않지만 함수 나 객체에 국한되지는 않습니다.