본문 바로가기

My Study/Function

WaitForSingleObject 함수

함수의 형태를 아래와 같이 생겼습니다.

DWORD WINAPI WaitForSingleObject(
  __in  HANDLE hHandle,
  __in  DWORD dwMilliseconds
);

위 함수는 커널 오브젝트의 상태 정보를 확인하는데 사용 됩니다.
즉, 해당 리소스의 커널 오브젝트가 Signaled인지 Non-Signaled인지 알 수 있습니다.

해당 리소스가 살아있으면 Non-Signaled (FALSE)이고 
해당 리소스가 종료되면 Signaled(TRUE)를 커널 오브젝트안에 가지고 있습니다.

첫번째 인자로는 해당 커널 오브젝트 핸들을 지정해 주고
두번째 인자는 Signaled 상태가 될 때까지 기다릴 수 있는 최대 시간을 밀리초 단위로 지정해 줍니다.
(INFINITE라고 인자를 주시면 해당 리소스가 종료 될 때까지 기다리고 있습니다. 
 즉, Signaled가 될 때까지 기다린다는 뜻입니다.)

자세한 내용은 MSDN을 참조해주세요 ^^

간단한 예제 소스로 결과를 확인해 봅시다.

===========================
예제 소스
===========================
#include <stdio.h>
#include <Windows.h>
#include <tchar.h>

int _tmain(int argc,TCHAR* args[])
{
STARTUPINFO start_info={0,};
PROCESS_INFORMATION process_info;

SetCurrentDirectory(_T("C:\\WINDOWS\\system32"));
TCHAR Command[] = _T("notepad.exe");

        /*메모장을 생성*/
CreateProcess(NULL,Command,NULL,NULL,TRUE,0,NULL,NULL,&start_info,&process_info);
       
       /*메모장이 종료 될때까지 멈춰있음*/
WaitForSingleObject(process_info.hProcess,INFINITE);

_tprintf(_T("Exit notepad. \n"));

return 0;
}

아마 실행해 보시면 메모장이 띄워지고 WaitForSingleObject 함수에서 멈춰 있는 것을 알 수 있습니다.
그리고 메모장을 끄시면 "Exit notepad."라는 문장이 출력되면서 예제소스 프로그램이 종료되는 것을 보실 수 있습니다.

======================================
쓰레드 동기화 시 사용되는 경우
======================================
쓰레드 동기화 시키는 방법에는 유저모드와 커널모드로 나눠지지만 WaitForSingleObject함수를 사용하는 경우는 
커널모드 쓰레드 동기화일 때만 사용합니다. 그에대한 2가지 방법으로  뮤텍스, 세마포어가 있습니다.

뮤텍스와 세마포어는 커널모드 쓰레드 동기화 방법 이므로 생성하면 커널 오브젝트 상태를 지닙니다.

1. 뮤텍스
임계영역에 들어가기 위해서는 무작정 들어가는 것이 아니라 키를 가지고 있어야만 들어갈 수 있는 것 입니다.
그럴 때 키는 얻는 함수로 사용되는 것이 WaitForSingleObject가 될 수 있습니다.
임계영역을 빠져나오면 키를 반환해야 하므로 그때 사용하는 함수는 ReleaseMutex가 되겠습니다.
간단하게 뮤텍스를 이용해 쓰레드들이 임계영역에 동시접근 하는 것을 막아보겠습니다.

상황을 간단하게 말하면
하나의 ATM기계가 있는데 10명의 사람들이 일을 보고 나오려고 하는 상황입니다.
각 사람들이 일보는 시간은 10~20초 사이입니다. ( 잘 안보이시면 클릭 )

위에 Working이라는 함수에서 WaitForSingleObject라는 함수를 사용하고 있는데 들어갈 수 있는 권한을 얻는 것입니다.
뮤텍스 커널 오브젝트도 마찬가지로 Non-Signed상태와 Signed상태가 있는데 해당 뮤텍스 커널 오브젝트가 Signed상태가 될때까지 기다리는 것입니다. Signed상태가 되면 기다리는 것들 중지하고 해당 쓰레드가 임계영역으로 들어가는 것입니다.

실행 결과 입니다.

동기화 방법 중에 뮤텍스 말고도 세마포어라는 것이 있는데 세마포어는 뮤텍스에 없는 카운트 기능이 있습니다.
즉, 임계영역에 동시에 들어 갈 수 있는 쓰레드의 개수를 정할 수 있는 기능이 있습니다.
하지만 WaitForSingleObject를 사용하는 방법은 같으므로 생략하도록 하겠습니다.

'My Study > Function' 카테고리의 다른 글

WriteFile  (0) 2010.02.24
ReadFile  (0) 2010.02.24
CreateFile  (0) 2010.02.24
CreateProcess  (0) 2010.02.24
fopen의 정체  (0) 2010.02.24