CreateEvent
대기상태에 있는 스레드 모두를 실행가능한 상태로 변경해 줄 수 있다.
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset,
BOOL bInitialState,
LPTSTR lpName
);
lpEventAttributes : NULL 넣어주면 된다.
bManualReset : manual-reset 모드 event로 생성할 것인지 auto-reset 모드 event로 생성할 것인지 지정.
만약 TRUE를 전달하면 manual-reset모드의 event가 발생하는데
event가 signaled 상태에 있을 경우 resetevent함수를 호출하지 않는 이상 non-signaled상태로 돌아가지 않는다.
반면에 FALSE를 전달하면 WaitForSingleObject함수가 호출이 성공적으로 끝난 후에 non-signaled로 변경된다.
bInitialState : TRUE인 경우 signaled 상태의 event가 생성, FALSE인 경우 non-signaled상태의 event가 생성.
lpName : 생성되는 event의 이름을 줄경우. 없는경우는 그냥 NULL.
예제 프로그램.
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <process.h>
unsigned int WINAPI NumberOfA(void* arg);
unsigned int WINAPI NumberOfOthers(void* arg);
void ErrorHandling(char* message);
char String[100];
HANDLE hEvent;
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hThread1, hThread2;
DWORD dwThreadID1, dwThreadID2;
// manual-reset 모드, 초기상태 non-signaled로 생성.
hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
if(hEvent == NULL)
{
puts("Event 오브젝트 생성 실패");
exit(1);
}
// 스레드 생성, 각자 function 호출
hThread1 = (HANDLE)_beginthreadex(NULL, 0, NumberOfA, NULL, 0, (unsigned*)&dwThreadID1);
hThread2 = (HANDLE)_beginthreadex(NULL, 0, NumberOfOthers, NULL, 0, (unsigned*)&dwThreadID2);
if(hThread1 == 0 || hThread2 == 0)
{
puts("스레드 생성 오류");
exit(1);
}
fputs("문자열을 입력하세요 : ", stdout);
fgets(String, 30, stdin);
SetEvent(hEvent); // event를 signaled로 변경.
if(WaitForSingleObject(hThread1, INFINITE) == WAIT_FAILED)
ErrorHandling("스레드 wait 오류");
if(WaitForSingleObject(hThread2, INFINITE) == WAIT_FAILED)
ErrorHandling("스레드 wait 오류");
CloseHandle(hEvent);
getchar();
return 0;
}
unsigned int WINAPI NumberOfA(void* arg)
{
int i;
int count = 0;
// 처음 event 생성시 non_signaled이므로 바로 대기상태로 됨.
WaitForSingleObject(hEvent, INFINITE);
for(i=0; String[i] != 0; i++)
{
if(String[i] == 'A')
count++;
}
printf("A의 문자의 수 : %d\n", count);
return count;
}
unsigned int WINAPI NumberOfOthers(void* arg)
{
int i;
int count = 0;
// 처음 event 생성시 non_signaled이므로 바로 대기상태로 됨.
WaitForSingleObject(hEvent, INFINITE);
for(i=0; String[i] != 0; i++)
{
if(String[i] != 'A')
count++;
}
printf("A가 아닌 문자의 수 : %d\n", count);
return count;
}
void ErrorHandling(char* message)
{
fputs(message, stderr);
fputc('\n', stderr);
exit(1);
}
입력한 문자열을 해석하기 위해 두개의 스레드를 생성한다.
이 두개의 스레드는 이벤트를 생성할 때부터 manual-set으로 생성하고 non_signaled이기 때문에
WaitForSingleObject에서 무한 대기 하다가 SetEvent에 의해 signaled상태로 바뀌어 실행하게 된다.
'Study > Network' 카테고리의 다른 글
_beginthreadex (2) | 2010.10.30 |
---|---|
WaitForSingleObject (0) | 2010.10.30 |