>
Programming/C++

멀티쓰레드 세마포어 연습

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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#include <iostream>
 
#include <windows.h>
 
#include <process.h>
 
  
 
#define THREAD_COUNT 4
 
#define SEMAPHORE_START 2
 
#define SEMAPHORE_MAX 2
 
  
 
HANDLE g_semaphore = NULL;
 
int number = 0;
 
  
 
unsigned int __stdcall threadFun(void *lpVoid)
 
{
 
    //함수 입장
 
    std::cout << "Enter : " << __FUNCTION__ << std::endl;
 
  
 
    for (int i = 0; i < 10; i++)
 
    {
 
        WaitForSingleObject(g_semaphore, INFINITE);
 
        //std::cout << "EnterSemaphore : " << __FUNCTION__ << std::endl;
 
  
 
        std::cout << number << __FUNCTION__ << std::endl;
 
        number++;
 
  
 
        //std::cout << "EndSemaphore: " << __FUNCTION__ << std::endl;
 
        ReleaseSemaphore(g_semaphore, 1, NULL);    //세마포어 카운트를 1올려줌
 
    }
 
  
 
    //함수 종료
 
    std::cout << "End : " << __FUNCTION__ << std::endl;
 
    //_endthreadex(0); 생략 가능
 
    return 0;
 
}
 
  
 
int main()
 
{
 
    HANDLE hThread[THREAD_COUNT];
 
    g_semaphore = CreateSemaphore(NULL, SEMAPHORE_START, SEMAPHORE_MAX, NULL); //세마포어를 초기값 2, 최대값 2로 설정
 
  
 
    //쓰레드 생성
 
    for (int i = 0; i < THREAD_COUNT; i++)
 
    {
 
        hThread[i] = (HANDLE)_beginthreadex(NULL, 0, threadFun, NULL, 0, NULL);
 
    }
 
  
 
    WaitForMultipleObjects(THREAD_COUNT, hThread, true, INFINITE);
 
  
 
    for (int i = 0; i < THREAD_COUNT; i++)
 
    {
 
        CloseHandle(hThread[i]);
 
    }
 
    CloseHandle(g_semaphore);
 
  
 
    return 0;
 
}


결과 화면 

세마포어 특성상 여러개의 쓰레드에서 접근할 수 있다.

이 때문에 값 동기화가 제대로 이루어지지 않은 부분이 보인다

(네이버 블로그 - 2016.02.14. 22:23)

,

최근 댓글

최근 트랙백

알림

이 블로그는 구글에서 제공한 크롬에 최적화 되어있고, 네이버에서 제공한 나눔글꼴이 적용되어 있습니다.

태그

카운터

Today :
Yesterday :
Total :