본문 바로가기

프로그래밍/C/C++

동기화 Event, WaitForSingleObject 맞추기

반응형


프로그램을 만들다보면 비동기, 동기 이런 말들이 나온다.

동기를 맞춘다는건 난 어떠한 일들에 대해서 순차적으로 할거야

ex) 1개의 프로그램에서 할 수 있는 일들

비동기라는건 난 어떠한 일들에 대해서 들어오는 순서대로 할거야 정도로 표현해도 될거 같다.

ex)1개의 프로그램에서 다른 하나의 루프를 만들어 다른일을 처리 할 수 있게 만드는 일


#include <stdio.h>

#include <windows.h>

using namespace std;


HANDLE hEvent = NULL;


HANDLE hThread_1 = NULL;

HANDLE hThread_2 = NULL;


DWORD WINAPI ThreadFunc1(LPVOID arg);

DWORD WINAPI ThreadFunc2(LPVOID arg);

void main()

{


DWORD dwThreadID1 = 0;

DWORD dwThreadID2 = 0;


hEvent = CreateEvent(NULL, TRUE, FALSE, "Event");


hThread_1 = CreateThread(NULL, 0, ThreadFunc1, NULL, 0, &dwThreadID1);

hThread_2 = CreateThread(NULL, 0, ThreadFunc2, NULL, 0, &dwThreadID2);


WaitForSingleObject(hEvent,INFINITE);




}


DWORD WINAPI ThreadFunc1(LPVOID arg)

{  

printf("Thread1 Out\n");

return 0;

}


DWORD WINAPI ThreadFunc2(LPVOID arg)

{

Sleep(3000);

SetEvent(hEvent);

return 0;

}


위의 프로그램은 2개의 쓰레드, 1개의 이벤트를 가지고 만들었다

메인에서 2개의 쓰레드와 1개의 이벤트를 만들고
첫번째 쓰레드는 아무것도 없이 끝난다.

두번째 쓰레드는 3초간 Sleep상태에서 벗어나고 SetEvent를 해준다.

그리고 메인코드에선 SetEvent가 오기까지 Wati...(INFI..)상태가 된다.
SetEvent되기전까지 종료 될 수가 없는 상황

여기서 2번쨰 쓰레드에서 SetEvent를 해주면 무사히 프로그램은 종료.

이런식의 Event 사용은 추후 어떠한 다중 작업 프로그램을 만들때 유용할 것이다.

반응형