스레드 세 개가 각각 + -  그리고 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(NULL0, increase, thisNULL&dwThreadId[0]);
            hThread[1= CreateThread(NULL0, decrease, thisNULL&dwThreadId[1]);
            hThread[2= CreateThread(NULL0, print, thisNULL&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


+ Recent posts