이야기박스

c++) CreateThread, Critical Section 본문

Programming Language/c, c++

c++) CreateThread, Critical Section

박스님 2017. 11. 24. 15:11
반응형

안녕하세요. 오늘은 프로세스 생성과 임계구역 사용법을 다루어 볼려고 합니다.

저는 비주얼 스튜디오를 사용하고 있기 때문에, 

fork() 함수가 아닌 CreateThread() 함수를 이용하여 프로세스를 생성할 것입니다.


* windows.h 헤더 내용을 다루고 있어요


공유 변수 cnt 가 어떻게 다루어지는지 살펴 보도록 하겠습니다.




- 코드

#include <iostream>
#include <Windows.h>

using namespace std;

#define MAX 100000

volatile int cnt;
CRITICAL_SECTION cs;

DWORD WINAPI ThreadFunc(LPVOID lpParam) {
	for (int i = 0; i < MAX; ++i) {
		++cnt;
	}
	return 0;
}

DWORD WINAPI ThreadFunc2(LPVOID lpParam) {
	for (int i = 0; i < MAX; ++i) {
		EnterCriticalSection(&cs);
		++cnt;
		LeaveCriticalSection(&cs);
	}
	return 0;
}

int main() {
	// 스레드 개수
	const int num = 10;

	HANDLE hThread[num];
	DWORD id[num] = { NULL, };

	// 임계 구역 사용 하지 않음
	for (int i = 0; i < num; ++i) {
		hThread[i] = CreateThread(NULL, 0, ThreadFunc, (LPVOID) i, 0, &id[i]);
	}
	
	WaitForMultipleObjects(num, hThread, true, INFINITE);

	cout << "non-critical section result : " << cnt << endl;
	cnt = 0;
	InitializeCriticalSection(&cs);


	// 임계 구역 사용
	for (int i = 0; i < num; ++i) {
		hThread[i] = CreateThread(NULL, 0, ThreadFunc2, (LPVOID)i, 0, &id[i]);
	}

	WaitForMultipleObjects(num, hThread, true, INFINITE);
	DeleteCriticalSection(&cs);

	cout << "critical section result : " << cnt << endl;

	return 0;
}




- 실행 결과






여러번 실행하다, 운이 좋으면 임계구역을 설정하지 않은 위에 결과 값도 1,000,000 이 나올 수 있겠죠. 

(운이 좋으면)


windows 헤더를 보시면 다양한 매서드들을 제공하고 있으니, 잘 알아보고 사용하면 코딩이 간편해질 것 같네요.

저도 critical section 관련 매서드들이 있을 줄은 몰랐어요 ㅋㅋ 하면서 알았음.


반응형