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

6-2-3. Critical Section 실습

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;

CRITICAL_SECTION cs;

int totalCount = 0;
UINT threadProc(void* p)
{
    totalCount++;
    int count = totalCount;
    static int value = 0;
    printf("%d번째 쓰레드 진입.. value = %d\n", count, value);
    EnterCriticalSection(&cs);
    for (int i = 0; i < 100; i++)
        value += 1;

    LeaveCriticalSection(&cs);
    printf("\t%d번째 쓰레드 종료.. value = %d\n", count, value);
    return 0;
}


int main()
{
    InitializeCriticalSectionAndSpinCount(&cs, 4000);

    vector<HANDLE> vH;

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

    WaitForMultipleObjects(5, vH.data(), TRUE, INFINITE);

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

    DeleteCriticalSection(&cs);
    return 0;
}
  • 쓰레드 함수 안에 정적 변수 value가 있고,
  • 각 쓰레드마다 value의 값을 100씩 증가시킴
  • 쓰레드가 동시에 value에 접근하면 출력이 100, 200, 300, 400, 500으로 딱 떨어지지 않을 것임

종료 시 출력하는 value 값을 통해 임계영역에서의 직렬화가 이루어지고 있음을 확인할 수 있었다.

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

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

댓글