이벤트를 이용한 동기화 방법

원래벌레·2022년 4월 12일
0
  • 갑질메타 직원(커널)이 순서를 보장해준다.
    1) 대기를 타던 애가 커널에게 신호가 잡히면 나 좀 깨워줘 하고 잠을잔다.
    2) 그리고 화장실을 쓰던 애가 다 쓰고 나오면 커널에 가서 신호를 준다.
    3) 그러면 커널이 해당 신호가 바뀐걸 보고 대기 타던애를 호출한다.

드문드문 데이터를 가져올 때, while문을 계속해서 돌리는 것은 비효율적이다.

💎 코드

#include <window.h>

HANDLE handle;

handle=CreateEvent(NULL,FALSE,FALSE,NULL)
::SetEvent(handle)
::WaitForSingleObject(handle,INFINITE)
::ResetEvent(handle)
::CloseHandle(handle)
  • HANDLE은 정수형처럼 어떤 숫자이다. 이 숫자는 이벤트에 대한 식별자키이다.

  • CreateEvent 함수를보면 인자가 총 네가지가 있다.
    1) 첫번째 인자 : 보안속성
    2) 두번째 인자 : 두번째 인자는 중요하다. 여기서 값은 bool 값이 들어가는데, Auto/Manual Reset을 나타낸다. 만약에 두번째 인자 값이 FALSE 라면 신호를 받고 다음애가 화장실에 들어가면 신호를 다시 바꿔준다. 반대로 TRUE라면 자동으로 되지않고, ::ResetEvent(handle) 명령어를 통해서 수동으로 빨간불을 켜줘야 한다.
    3) 세번째 인자 : 세번째 인자는 Event는 신호의 초기값이다. FALSE라면 해당 값은 빨간불이고, True라면 해당 값으 초록불이다.
    4) 네번째 인자 : 네번째 인자는 이벤트의 이름이다. 선택적으로 적으면 된다. 여기선 NULL을 주어 이름을 주지 않았다.

  • ::WaitForSingleObject(handle,INFINITE) 해당 함수는 영원히 자면서 시그널을 기다린다.

  • ::SetEvent(handle) 해당 이벤트가 시그널 상태이다.

  • ::CloseHandle(handle) 핸들을 종료한다.

cf) 이 이벤트 동기화 방법은 프로세스간에 동기화를 할 때도 이용한다.

cf2) 그냥 :: 만 사용하게 되면
현재 존재하는 모든 전역변수와 전역함수들을 지역변수, 지역함수와 구분지어 사용할 수 있게된다.

profile
학습한 내용을 담은 블로그 입니다.

0개의 댓글