#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 값을 통해 임계영역에서의 직렬화가 이루어지고 있음을 확인할 수 있었다.
댓글