2014-03-24 2 views
0

CreateThread()과 함께 프로그램 내에서 스레드를 만들 수 있으며 원래 프로그램으로 돌아 가기 전에 완료하려면 WaitForSingleObject()이 필요합니다.스레드 만들기

제 질문은 원래 프로그램도 스레드입니까? 내 프로그램에 변수 a=3이 있습니다. 그런 다음 스레드를 만듭니다. 두 번째 스레드에서 변수 a에 액세스 할 수 있습니까?

+0

어 ... 일반적으로 추가 스레드를 만드는 요점은 프로그램이 여러 가지 일을 동시에 수행 할 수 있으므로 스레드를 생성하고 즉시 'WaitForSingleObject'를 호출하는 것이 무의미하다는 것입니다. –

답변

1

Windows O/S가 프로세스를 시작하면 해당 프로세스의 첫 번째 스레드도 생성됩니다.

"원래 프로그램"이 잘못된 이름입니다. 그러나 progra m을 실행하는 초기 항목은 스레드입니다.

변수 범위가 액세스 할 수있는 것보다 두 번째 스레드에서 액세스를 허용하는 경우. 특정 변수에 대한 액세스를 전달하려는 경우 CreateThread에 적절한 매개 변수를 사용하여 포인터를 전달할 수 있습니다. 그러나주의 : 원래 스레드의 실행이이 변수의 범위를 벗어나면 포인터가 유효하지 않게됩니다. 나는 재 설계를 고려할 것을 권한다.

편집 요청하신대로 범위를 벗어나는 변수에 대한 예입니다. 스레드가 실행의 OS 기본 단위 인 -

DWORD TheThread(void*p) 
{ 
    int *pcounter = (int*)p; 
    // do anything with pcounter 
} 

HANDLE MakeItRun() 
{ 
    int counter; 
    return CreateThread(0, 0, &TheThread, &counter, 0, 0); 
} // scope of counter ends here 

int main() 
{ 
    HANDLE h; 
    h = MakeItRun(); 
    WaitForSingleObject(h, INFINITE); 
} 
+0

그럼 상위 코드 블록에 있다면 내 스레드에서 찾을 수 있습니까? 글로벌 일 필요는 없습니까? 또한 원래 프로그램의 전체 기간 동안 고유 한 스레드입니까? –

+0

각 스레드는 스레드의 런타임을 위해 자체 스택을 가지고 있습니다. 이것은 변수의 범위가 남을 때까지 모든 지역 변수를 포함합니다. – harper

+0

변수가 범위를 벗어나는 예제를 보여줄 수 있습니까? 변수가 생성 된 후에 스레드가 생성되면 범위를 벗어나는 것을 상상할 수 없습니다. 의사 코드 일 수 있습니다. –

0

예 : 이것은 잘못된 구현 될 것이다. 제 3 대, 런니 없음.

1

이 작동하지 않습니다

DWORD WINAPI threadProc(LPVOID param) 
{ 
    a = 5; 
} 

int main() 
{ 
    int a = 3; 
    HANDLE thread = CreateThread(NULL, 0, threadProc, NULL, 0, NULL); 
    WaitForSingleObject(thread, INFINITE); 
} 

컴파일러는 athreadProc에 선언되지 않은 것을 말하고 오류를 발행합니다.

당신은 비록 포인터를 전달할 수 있습니다 : 당신은 스택 변수의 범위는 스레드를 들보 다 오래 남았습니다 보장으로

DWORD WINAPI threadProc(LPVOID param) 
{ 
    int *aPtr = (int *)param; 
    *aPtr = 5; 
} 

int main() 
{ 
    int a = 3; 
    HANDLE thread = CreateThread(NULL, 0, threadProc, &a, 0, NULL); 
    WaitForSingleObject(thread, INFINITE); 
    // value of a is now 5 
} 

이만큼, 완벽하게 올바른 기술이다.

전역 변수 또는 대체 양식 (싱글 톤 클래스, 정적 클래스 변수)을 사용하여 스레드간에 메모리를 공유 할 수도 있습니다.