본문 바로가기

Win32 API

5. Win32 API - Event

사전 지식

 

동기화

  • 어떠한 작업을 복수 작업자에게 전달합니다.
  • 시스템을 동시에 작업시키기 위해서 여러 작업자들의 동작을 동조화 시키는 방법을 동기화라고 정의합니다.
  • 다음 작업이 이뤄지기 전에 먼저 완료된 작업자가 나머지 작업자의 완료를 기다리는 방식으로 진행됩니다.

Thread

  • 프로그램의 실행 주체입니다.
  • 하나의 스레드로 작업을 수행하는 경우 동기화가 필요하지 않습니다.
  • 두 개 이상의 스레드로 작업하는 경우 상황에 따라 동기화가 필요한 경우가 존재합니다.

 

ACL

  • 커널 객체들은 생성 시 보안 설명자를 할당 받습니다.
  • 보안 설명자들의 정보에는 ACL정보가 포함되어있습니다.
  • ACL은 여러 개의 ACE(접근 조절 항목)으로 구성되어 있으며 ACE는 보안 ID와 접근 권한에 대한 정보로 이루어져 있습니다.
  • 새로운 커널 객체를 생성하거나 커널 객체를 여는 API 함수에는 ACL을 적을 수 있는 매개 변수 또는 매개변수의 세부 항목이 존재합니다.
  • ACL을 작성하지 않았다면 부모 프로세스로부터 ACL을 추출하여 커널 객체의 보안 기술자에 ACL을 기록합니다.

 

Event 객체

  • Windows에서 동기화 작업을 위해 관리하는 객체입니다.
  • 같은 프로세스 뿐만이 아니라 서로 다른 프로세스에 있는 스레드 간에서도 사용할 수 있습니다.
  • 서로 다른 두 프로그램에서도 동기화 개념을 사용하기 위해 이벤트 객체를 사용할 수 있습니다.

 

이벤트 객체 생성 - CreateEvent

  • 이벤트 객체를 생성하는 함수입니다.
  • 이벤트 객체를 만들고 핸들값을 반환하는 역할을 수행합니다.

 

핸들 값 반환 - CloseHandle

  • 이벤트 객체는 커널 객체이기 때문에 사용이 끝나는 경우 객체 핸들 값을 CloseHandle함수에 인수로 담아 호출해서 해제해야 합니다.
  • 다른 프로세스의 스레드와 공유되는 경우 한쪽에서만 CloseHandle 함수를 호출한다고 객체가 제거되는 것이 아닌 공유되는 스레드 모두에서 CloseHandle을 사용해야지만 이벤트 객체가 제거됩니다.

 

객체의 상태 제어 SetEvent, ResetEvent

SetEvent

  • 이벤트 객체의 상태를 시그널 상태로 변경됩니다.
  • 대기 중인 스레드 중 하나에게 신호가 전달됩니다.
  • 스레드가 작업을 수행합니다.

 

ResetEvent

  • 이벤트 객체의 상태를 논 - 시그널 상태로 변경됩니다.
  • 대기 중인 스레드가 이벤트 객체가 시그널 상태가 될때까지 대기하게 됩니다.

 

객체의 상태 체크하기 WaitForSingleObject

  • 두 개 이상의 스레드 간에 작업시점을 동기화하기 위해 사용하는 함수입니다.
  • 한쪽에서 SetEvent 또는 ResetEvent 함수를 사용하여 객체 상태 값을 변경하면 다른쪽에서는 이벤트 객체의 상태 값이 변경되는지 체크하는 작업을 수행해야 합니다.
  • 함수 호출시 이벤트 객체의 상태 값을 해당 함수로 확인한 뒤 상태 값을 참조하여 작업을 지정합니다.

참고

보안 설명자
ACL 구조체
CreateEvent함수
Win32 문서

'Win32 API' 카테고리의 다른 글

7. Win32 API - Windows 프로그램 구성  (0) 2024.02.24
6. Win32 API - WindowClass  (0) 2024.02.24
4. Win32 API - Message  (0) 2024.02.19
3. Win32 API - hInstance  (0) 2024.02.19
2. Win32 API - Handle  (0) 2024.02.19