ㅇ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 | #include <process.h> #include <Windows.h> #include <tchar.h> #include <iostream> #include <string.h> using namespace std; int total = 0; #define SIZE 10 #define NumberOfThread 3 DWORD WINAPI ThreadProc(LPVOID pParam); struct ArrayInput { int array[SIZE]; int num; ArrayInput() { num = 0; memset(array, 0, sizeof(int)*SIZE); } void setArray() { cout << SIZE << "개의 숫자를 입력해주세요" << endl; for (int i = 0; i < SIZE; i++) { cin >> array[i]; } } void printArray() { cout << "array내의 배열원소 값은 : "; for (int i = 0; i < SIZE; i++) { cout << array[i] << ", "; } cout << endl; } }; struct MyThread { HANDLE hThread[NumberOfThread]; DWORD dwThreadId[NumberOfThread]; ~MyThread() { for (int i = 0; i < NumberOfThread; i++) { CloseHandle(hThread[i]); } } void execute(ArrayInput* arr){ for (int i = 0; i < NumberOfThread; i++) { hThread[i] = CreateThread(NULL, 0, ThreadProc, (LPVOID)arr, 0, &dwThreadId[i]); } } }; DWORD WINAPI ThreadProc(LPVOID pParam) { CRITICAL_SECTION _thislock; InitializeCriticalSection(&_thislock); ArrayInput* t = (ArrayInput*)pParam; int term = SIZE / NumberOfThread; EnterCriticalSection(&_thislock); if (t->num != term*(NumberOfThread-1)) { for (int i = 0; i < term; i++) { total += t->array[t->num]; (t->num)++; } } else { while (t->num != SIZE) { total += t->array[t->num]; (t->num)++; } } LeaveCriticalSection(&_thislock); return 0; } void printValue(MyThread* t) { WaitForMultipleObjects(NumberOfThread, t->hThread, true, INFINITE); cout << "total : " << total << endl; cout << "avg : " << total / NumberOfThread << endl; } int _tmain() { MyThread t; ArrayInput arr1; arr1.setArray(); arr1.printArray(); t.execute(&arr1); printValue(&t); return 0; } | cs |
오랜만에 보는 코드다. 처음 써본 Critical Section 이였는데 재밌었던것 같다.
사실 틀린 코드인데 틀린 자체로 올리자고 한다.
일단 ThreadProc 즉 스레드 함수 들어가면서 InitializeCriticalSection을 해줘버렸다..
이렇게 되면 전역변수로 만든 CriticalSection 이라도 Thread함수에 들어가면서 Signal 상태로 만들어 주기 때문에 동기화가 되지 않는다..
밖으로 빼내줘야 했어야 했다..
그리고 Thread 내부 함수가 너무 더러운 것 같다.. 지금은 합을 하는데 있어서 조금 다른 코드를 쓰고 있다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | ///* Main */// while(index < 10 ){ hThread[index%3] = CreateThread(NULL,0,Sum,(LPVOID)arr,NULL,&dwthreadId[index%3]); } //////////////////////////////////// DWORD WINAPI Sum(LPVOID pParam) { int* arr = (int*)pParam; if (index < 10) { EnterCriticalSection(&gCritical); total += arr[index]; index += 1; LeaveCriticalSection(&gCritical); } return 0; } | cs |
여기서 스레드 3개를 쓰고 있는데.. Index를 전역변수로 두고 index 가 10에 도달하기 전까지 스레드가 돌고 있다..
스레드 하나가 여러개 씩 더하는 방식이 아니라 스레드 하나가 하나씩 더하도록 해놨다..
'시스템프로그래밍' 카테고리의 다른 글
이벤트를 사용한 예제 (0) | 2018.05.26 |
---|---|
뮤텍스와 크리티컬섹션을 이용한 기본 예제 (0) | 2018.05.26 |
크리티컬 섹션과 파일입출력을 통한 기본예제.. (0) | 2018.05.26 |
멀티프로세스 기본예제 (0) | 2018.05.26 |
파일 입출력 예제.1 (0) | 2018.05.26 |