본문 바로가기
프로그래밍/C & C++

[C/VC] 간단한 Critical Section 테스트

by 체리 2011. 3. 6.
반응형
테스트용
비록 올바른 사용 예는 아닐 수 있지만 사용법 숙달을 위해..

#include <stdio.h>
#include <windows.h>
#include <process.h>

// 쓰레드 함수
void threadTest1(void* param);
void threadTest2(void* param);

// 계산 함수
void cal(int num);

// 테스트 숫자
static int maxCnt = 20;

// 계산 결과를 저장
static int result = 0;

// Critical section Variable
CRITICAL_SECTION cs;

// 메인 함수
int main(void)
{
	// 초기화
	InitializeCriticalSection(&cs);

	int i;
	for(i = 0; i < 5; i++)
	{
		// 변수 초기화
		result = 0;

		// 쓰레드 시작
		HANDLE handles[2];
		handles[0] = (HANDLE)_beginthread(threadTest1, 0, NULL);
		handles[1] = (HANDLE)_beginthread(threadTest2, 0, NULL);

		// 쓰레드가 모두 종료될 때까지 대기
		WaitForMultipleObjects(2, handles, TRUE, INFINITE);

		// 결과 출력
		printf("계산 결과: %d\n", result);
	}

	return 0;
}

// 쓰레드 함수 구현
void threadTest1(void* param)
{
	int loopcnt = 0;

	do
	{
		cal(1);
		Sleep(1);
	} while(maxCnt > ++loopcnt);

	_endthread();
}

void threadTest2(void* param)
{
	int loopcnt = 0;

	do
	{
		cal(2);
		Sleep(1);
	} while(maxCnt > ++loopcnt);

	_endthread();
}

// 계산 함수
void cal(int num)
{
	int tmp = 0;

	EnterCriticalSection(&cs);

	// 연산
	tmp = result;
	tmp += num;
	Sleep(1);	// 일부러 Context switching 해버릴 수도 있도록
	result = tmp;

	LeaveCriticalSection(&cs);
}

반응형

댓글