기록은 기억을 이기고 시간보다 오래 남는다.

프로그래밍 언어/c프로그래밍

세미포어(Semaphore) 활용, 1000보다 큰 값 유지하는 프로그램(c++, Thread)

준_준 2022. 1. 4. 15:10

Semaphore를 활용하여 동기화하며 1000보다 큰 값을 유지하는 프로그램을 만들었습니다.

 

각 쓰레드의 역할은

Thread 1 = 값을 감소하는 쓰레드 

Thread 2 = 값을 증가하는 쓰레드

Thread 3 = 값을 출력

입니다.

 

아래 사진은 간단한 순서도 입니다.

부족한 점이 많습니다. 많은 조언 부탁드립니다.

===========================
#include <stdio.h>
#include<iostream>
#include <windows.h>
#include <tchar.h>
using namespace std;

int g_total = 997;
//전역변수 설정

HANDLE hSemaphore[3];
DWORD WINAPI ThreadMinus(LPVOID lpParam)
{//g_total의 값을 하나씩 감소시키는 쓰레드
WaitForSingleObject(hSemaphore[0], INFINITE);
int* data = (int*)lpParam;

if (g_total > 1000)
{
g_total--;
cout << "g_total의 개수가 하나 감소(--)하였습니다. " << " ";
ReleaseSemaphore(hSemaphore[2], 1, 0);
Sleep(500);
}
else
{
ReleaseSemaphore(hSemaphore[1], 1, 0);
}
return 0; // 정상적 종료.
}


DWORD WINAPI ThreadPlus(LPVOID lpParam)
{//g_total의 값을 증가시켜주는 스레드
WaitForSingleObject(hSemaphore[1], INFINITE);
int* data = (int*)lpParam;

if (g_total <= 1000)
{
g_total++;
cout << "g_total의 개수가 하나 증가(++)하였습니다. " << " ";
Sleep(500);
ReleaseSemaphore(hSemaphore[2], 1, 0);
}
else
{
ReleaseSemaphore(hSemaphore[0], 1, 0);
}

return 0; 
}

DWORD WINAPI ThreadOutput(LPVOID lpParam)
{//g_total 값을 출력하는 쓰레드
WaitForSingleObject(hSemaphore[2], INFINITE);

cout << "증감된 g_total의 값은: " << g_total << endl;
Sleep(500);
ReleaseSemaphore(hSemaphore[0], 1, 0);


return 0;
}

int _tmain(int argc, TCHAR* argv[])
{
int i = 0;
DWORD dwThreadID[3];
HANDLE hThread[3];

Sleep(2500);
int data[1] = { 0, };

for (int i = 0; i < 3; i++)
{
hSemaphore[i] = CreateSemaphore(NULL, 0, 1, NULL);
}

while (i < 20)
{
hThread[0] =
CreateThread(
NULL, 0,
ThreadMinus,
(LPVOID)(data),
0, &dwThreadID[0]
);

hThread[1] =
CreateThread(
NULL, 0,
ThreadPlus,
(LPVOID)(&data),
0, &dwThreadID[1]
);

hThread[2] =
CreateThread(
NULL, 0,
ThreadOutput,
(LPVOID)NULL,
0, &dwThreadID[2]
);
i++;
}



if (hThread[0] == NULL || hThread[1] == NULL || hThread[2] == NULL)
{
cout << "Thread creation fault! \n";
return -1;
}

ReleaseSemaphore(hSemaphore[0], 1, 0);

WaitForMultipleObjects(3, hThread, TRUE, INFINITE);

//쓰레드 종료
CloseHandle(hThread[0]);
CloseHandle(hThread[1]);
CloseHandle(hThread[2]);

//Semaphore 종료
CloseHandle(hSemaphore[0]);
CloseHandle(hSemaphore[1]);
CloseHandle(hSemaphore[2]);

return 0;
}

반응형