728x90

쓰레드의 실행 순서를 동기화 한다는 것은 메모리에 접근하는 쓰레드의 실행 순서를 동기화 한다는 것이다. 즉 "실행 순서 동기화"는 "메모리 접근 동기화"를 포함하는 개념이다. 다만 초점이 실행 순서에 맞춰져 있고 이러한 부분을 부각시키기 위해 "실행 순서 동기화" 표현을 사용한다.

 

생산자 / 소비자 모델

생산자 / 소비자 모델은 실행되는 쓰레드의 순서가 중요한 상황을 설명할 때 종종 소개되는 모델이다.

생산자가 물건을 만들어야만 소비자가 소비할 수 있다. 이 순서가 바뀌어버린다면 소비자는 빈테이블에서 빵을 찾게되고, 소비자가 빈 테이블임을 알고 떠난 뒤에야 생산자가 빵을 가져다 놓는 일이 발생하게 된다. 당연히 이 빵은 소비되지 않고 남아있다.

 

이벤트(Event) 기반 동기화

세마포어나 뮤텍스와 같이 이 기법에서도 동기화를 위한 오브젝트가 사용된다. 이러한 오브젝트를 "이벤트(Event) 오브젝트"라고 표현한다. 그리고 이러한 오브젝트를 보편적으로 '이벤트'라고 부른다.

 

이벤트에는 이벤트를 생성 및 소멸시키는 함수와, 이벤트를 소유 및 반환하는 함수가 전부이다.

 

이벤트 오브젝트 생성 함수

HANDLE CreateEvent(

    LPSECURITY_ATTRIBUTES lpEventAttributes,

    BOOL bManualReset,

    BOOL bInitialState,

    LPCTSTR lpName

);

1.lpEventAttributes : 보안 속성을 지정할 때 싸용한다.

2.bManualReset : 수동 리셋(Manual-Reset)모드로 이벤트 오브젝트를 생성하느냐, 자동 리셋(Auto-Reset)모드로 이벤트 오브젝트를 생성하느냐를 결정짓는다. TRUE가 전달될 경우 수동 리셋(Manual-Reset) 모드 이벤트 오브젝트가, FALSE가 전달될 경우 자동 리셋(Auto - Reset) 모드 이벤트 오브젝트가 생성된다.

3.bInitialState : 이벤트 오브젝트의 초기 상태 결정, TRUE가 전달될 경우 Signaled 상태로 생성되고, FALSE 일 경우 Non-Signaled 상태의 이벤트가 생성된다.

4.lpName : 이벤트 오브젝트에 이름을 줄 경우에 사용하는 전달인자이다.

 

이벤트 오브젝트를 소멸시킬 때에는 다른 커널 오브젝트와 마찬가지로 CloseHandle 함수를 사용하면 된다.

 

쓰레드나 프로세스의 커널 오브젝트의 경우, Non-Signaled 상태로 생성되고 쓰레드나 프로세스가 종료될 경우 해당 커널 오브젝트는 Signaled상태로 자동 변경된다.

이벤트 오브젝트의 경우 자동으로 Signaled 상태가 되는 상황이없다.

특정 함수 호출을 통해서 Signaled 상태로 변경해주어야 한다. 이벤트 오브젝트가 Signaled 상태가 되어 대기중이던 쓰레드가 블로킹 상태를 빠져 나왔을 때(WaitForSingleObject 함수를 호출 완료) 이벤트 오브젝트의 상태가 그대로Signaled 상태라면, 수동 리셋 모드(Manual-Reset 모드) 이벤트 오브젝트이고, 자동으로 Non-Signaled 상태로 변경됐다면, 자동 리셋 모드(Auto - Reset 모드) 이벤트 오브젝트이다.

 

벤트 오브젝트 실행순서 동기화

1.프로그래머 요청에 의해 이벤트는 Signaled 상태가 된다.

2.Non-Signaled 상태의 이벤트 오브젝트에 의해 WaitForSingleObject 함수 호출이 블로킹이 되면, Signaled 상태가 되는 순간 블로킹된 함수를 빠져나오게 된다. 이때 자동 리셋 모드 이벤트 오브젝트라면, Non-Signaled 상태로의 변경은 자동으로 이뤄진다.

 

이벤트 오브젝트의 경우 자동 리셋 모드일때 WaitForSingleObject함수에 의해 자동으로 Signaled->Non-Signaled 로 변경된다.

 

이벤트 오브젝트의 상태를 변경시키는 함수

BOOL ResetEvent(

   HANDLE hEvent

);

1.hEvent : 이벤트 오브젝트의 핸들을 인자로 전달한다. 전달된 핸들의 오브젝트는 Non-Signaled 상태가 된다.

 

수동 리셋 모드 이벤트 동기화의 경우 동시에 여러 쓰레드가 접근이 가능하도록 만들 수 있다.

 

BOOL SetEvent(

   HANDLE hEvent

);

1.hEvent : 이벤트 오브젝트 핸들을 인자로 전달한다. 전달된 핸들의 오브젝트가 Signaled 상태가 된다.

728x90

+ Recent posts