Thread/Windows

[Thread] WaitForSingleObject 에 대해

Binceline 2012. 10. 18. 16:56

다음은 소스코드.

/////////////////////////////////
#pragma comment(lib, "Ws2_32.lib")

#include <winsock2.h>
#include <Windows.h>
#include <process.h>
#include <stdio.h>

unsigned __stdcall handle(void *pData)
{
printf("thread 실행중\n");
Sleep(3000);
return 0;
}

void main()
{
HANDLE hThread;
DWORD dwThreadID;
DWORD dw;

hThread = (HANDLE)::_beginthreadex(nullptr, 0, handle, nullptr, 0, (unsigned*)&dwThreadID);
if(hThread == 0)
{
puts("_beginthreadex Error");
return;
}

dw = WaitForSingleObject(hThread, INFINITE); //
if(dw == WAIT_FAILED)
{
puts("thread error");
return;
}

printf("main 종료\n");
printf("thread 종료\n");
}

//////////////////////////////////

handle 함수에서 자식 스레드를 생성해서 돌리는데, 

만약 main이 먼저 종료된다면.. main은 부모 스레드이기 때문에 자식 스레드도 자연히 소멸된다. 

여기서 만약 WaitForSingleObject를 쓰지 않는다면, main이 먼저 종료되어 거의 실행 직후에 바로 종료가 될 것이다.

하지만 WaitForSingleObject를 사용하면 해당 스레드(hThread 핸들이 가리키는 스레드)가 2번째 인자로 들어오는 시간만큼 지연시켜 준다. 즉, 위 코드에서는 Sleep(3000)으로 인해 3초간 대기하게 되는 스레드가 생기는데, WaitForSingleObject의 2번째 인자를 2000으로 넣는다면, main스레드에서는 이순간부터 2초간 그 스레드가 Signal 상태가 되기를 기다린다(main 스레드는 정지된다). 2초가 지나면 다시 main스레드도 실행이 되기 시작한다. 2번째 인자를 INFINITE로 넣는다면, 해당 스레드가 완전히 종료될 때까지(Signal 상태가 될 때까지) main 스레드는 대기한다.

반응형