Programming/C++
- 2016. 3. 7. 12:22
멀티쓰레드 세마포어 연습
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)
'Programming > C++' 카테고리의 다른 글
VS2019 모던 C++ 마소 문서 (0) | 2019.05.02 |
---|---|
C++ 멀티쓰레드 기초적인 부분 간단 정리 (0) | 2016.03.07 |
멀티쓰레드 이벤트 연습 (0) | 2016.03.07 |
멀티쓰레드 뮤텍스 연습 (0) | 2016.03.07 |
멀티쓰레드 크리티컬 섹션 연습 (0) | 2016.03.07 |