이야기박스
c++) CreateThread, Critical Section 본문
반응형
안녕하세요. 오늘은 프로세스 생성과 임계구역 사용법을 다루어 볼려고 합니다.
저는 비주얼 스튜디오를 사용하고 있기 때문에,
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 관련 매서드들이 있을 줄은 몰랐어요 ㅋㅋ 하면서 알았음.
반응형
'Programming Language > c, c++' 카테고리의 다른 글
| c++ 버전 (0) | 2017.11.25 |
|---|---|
| c++) 피보나치 - 동적 계획법(Fibonacci - Dynamic Programming) (0) | 2017.11.24 |
| c++) 스플레이 트리 (Splay Tree) (0) | 2017.11.18 |
| c++) AVL 트리 ( 삽입, 삭제, 트리 출력 ) (0) | 2017.11.11 |
| c++) 이진 탐색 트리 (0) | 2017.11.04 |