본문 바로가기
운영체제/[ecourse] Windows Programming

6-2-2. Event 실습

by 헛둘이 2022. 9. 20.
배운 이론을 실습하는 과정
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <Windows.h>
#include <process.h>
#include <tchar.h>
using namespace std;

int globalMemory = 0;
HANDLE hEvent = INVALID_HANDLE_VALUE;

UINT writeValueProc(void* p)
{
    static int increase = 100;
    globalMemory += increase;

    SetEvent(hEvent);
    
    return 0;
}

UINT readValueProc(void* p)
{
    //WaitForSingleObject(hEvent, INFINITE);
    printf("read value : %d\n", globalMemory);
    return 0;
}


int main()
{
    //hEvent = CreateEventEx(0, L"MyEvent", 0, EVENT_ALL_ACCESS);

    vector<HANDLE> eH;

    for (int i = 0; i < 5; i++)
    {
        eH.push_back(
            (HANDLE)_beginthreadex(0, 0, readValueProc, 0, 0, 0)
        );
    }

    for (int i = 0; i < 5; i++)
    {
        eH.push_back(
            (HANDLE)_beginthreadex(0, 0, writeValueProc, 0, 0, 0)
        );
    }

    WaitForMultipleObjects(10, eH.data(), TRUE, INFINITE);

    for (HANDLE h : eH)
        CloseHandle(h);

    //CloseHandle(hEvent);

    return 0;
}
  • 전역 변수 globalMemory가 있고, 그 값에 접근하는 두 함수가 있다.
  • writeValueProc은 그 값에 100을 더한 후에 Event 객체를 시그널 상태로 변경한다.
  • readValueProc은 WaitForSingleObject로 대기하다가 시그널을 받고 그 값을 읽어오는 함수다.
  • 실험을 위해 Event 객체와 관련된 코드를 먼저 주석처리 해놓았다.

 

 

 

Event 객체를 사용하면?
  • 주석을 해제한 후 다시 실행해보면 결과는 아래와 같다.

출력 순서는 조금 다르지만 값이 정상적으로 들어오는 것을 확인할 수 있었다.

'운영체제 > [ecourse] Windows Programming' 카테고리의 다른 글

7-1. DllMain 기본 개념  (0) 2022.09.21
6-2-3. Critical Section 실습  (0) 2022.09.20
6-2-1. Semaphore 실습  (0) 2022.09.20
6-2. 동기화 개념과 Critical Section  (1) 2022.09.20
6-1. Thread Basic  (0) 2022.09.20

댓글