본문 바로가기

Windows/_System Programming

쓰레드(Thread) 실행순서 동기화

이벤트(Event) 기반 동기화 :

개념 :

생산자는 문자열을 생성한다(입력받는다), 소비자는 문자열을 소비한다(출력한다)

생산자가 문자열을 생성하고 나면, 이 상태를 감지한 소비자가 문자열을 가져가 소비한다.


이벤트 커널 오브젝트의 특성 :

1. 이벤트 커널 오브젝트는 파라미터에 의해 Signaled or Non-Signaled 상태로 생성된다.

2. 프로그래머의 요청에 의해 Signaled 상태가 된다.

3. 자동 리셋 모드 일시 WaitForSingleObject 함수 호출로 Signaled -> Non-Signaled 상태로 변경된다.
    수동 리셋 모드 일시 추가로 ResetEvent 함수를 사용한다.


사용법 :

HANDLE CreateEvent(
          LPSECURITY_ATTRIBUTES lpEventAttributes, // 보안속성
          BOOL bManualReset,  // TRUE : 수동 리셋 모드(Manual-Reset)
                                           // FALSE : 자동 리셋 모드(Auto-Reset)
          BOOL bInitialState,       // TRUE : Signaled 상태의 이벤트 커널 오브젝트 생성
                                           // FALSE : Non-Signaled 상태의 이벤트 커널 오브젝트 생성
          LPCTSTR lpName       // 이벤트 커널 오브젝트의 이름(NULL : 이름없는 이벤트 커널 오브젝트)
);
 
BOOL ResetEvent(
          HANDLE hEvent  // 이벤트 커널 오브젝트의 핸들 ( Non-Signaled 상태가 된다)
);

BOOL SetEvent(
          HANDLE hEvent  // 이벤트 커널 오브젝트의 핸들 (Signaled 상태가 된다)
);

CloseHandle() 함수로 핸들을 반환하여 끝낸다.



이벤트(Event) + 뮤텍스(Mutex) :

개념 :

생산자 하나에 소비자가 둘이다.

생산자가 생산하고 나면 소비자 둘은 동기화를 통해 소비해야 한다.


사용법 :

1. 생산자와 소비자간의 이벤트 기반 동기화를 한다. (실행순서 동기화)

2. 소비자간의 임계 영역에 뮤텍스(임계 영역 동기화 기법)로 동기화 한다. (메모리 접근 동기화)