스레드 세 개가 각각 + - 그리고 print 를 해서 값을 유지하는 하는 것을 보여주는 코드였다..
그것을 수동 Event를 통해 관리 했던 코드다. 그런데 정상적으로 종료하는 것에 대해선 고민하지 않았던 것 같다.
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 | #include <iostream> #include <Windows.h> using namespace std; DWORD WINAPI decrease(LPVOID pParam); DWORD WINAPI increase(LPVOID pParam); DWORD WINAPI print(LPVOID pParam); int g_total = 1000; struct Thread { HANDLE hEvent[3]; HANDLE hThread[3]; DWORD dwThreadId[3]; void Initialize() { hEvent[0] = CreateEvent(NULL, TRUE, TRUE, NULL); hEvent[1] = CreateEvent(NULL, TRUE, FALSE, NULL); hEvent[2] = CreateEvent(NULL, TRUE, FALSE, NULL); } void excute() { while (true) { hThread[0] = CreateThread(NULL, 0, increase, this, NULL, &dwThreadId[0]); hThread[1] = CreateThread(NULL, 0, decrease, this, NULL, &dwThreadId[1]); hThread[2] = CreateThread(NULL, 0, print, this, NULL, &dwThreadId[2]); Sleep(2000); } } }; DWORD WINAPI increase(LPVOID pParam) { Thread* t = (Thread*)pParam; WaitForSingleObject(t->hEvent[0], INFINITE); ResetEvent(t->hEvent[0]); g_total++; cout << "increase :" <<g_total << endl; SetEvent(t->hEvent[1]); return 0; } DWORD WINAPI decrease(LPVOID pParam) { Thread* t = (Thread*)pParam; WaitForSingleObject(t->hEvent[1], INFINITE); ResetEvent(t->hEvent[1]); g_total--; cout << "decrease :" << g_total << endl; ; SetEvent(t->hEvent[2]); return 0; } DWORD WINAPI print(LPVOID pParam) { Thread* t = (Thread*)pParam; WaitForSingleObject(t->hEvent[2], INFINITE); ResetEvent(t->hEvent[2]); cout << "print : " << g_total << endl; SetEvent(t->hEvent[0]); return 0; } int main() { Thread t; t.Initialize(); t.excute(); return 0; } | cs |
'시스템프로그래밍' 카테고리의 다른 글
동적 할당한 CritcalSection 제거시 나타나는 결과 (0) | 2018.07.25 |
---|---|
간단한 채팅서버 구현시 오류났던 부분 (0) | 2018.05.30 |
뮤텍스와 크리티컬섹션을 이용한 기본 예제 (0) | 2018.05.26 |
크리티컬 섹션과 파일입출력을 통한 기본예제.. (0) | 2018.05.26 |
크리티컬 섹션을 이용한 기본예제.. (0) | 2018.05.26 |