이야기박스
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 |