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;
}
'프로그래밍 언어 > c프로그래밍' 카테고리의 다른 글
문자를 입력받아 아스키 코드값으로 변환하여 출력하기(쉽게풀어쓴 c express 문자열 예제) (0) | 2021.12.12 |
---|---|
쉽게 풀어쓴 c 언어 EXPRESS 8장 함수 개정 2판 (0) | 2021.11.01 |
goto문을 활용하여 구구단 출력 프로그램(c언어) (0) | 2021.09.12 |
c언어로 계산기 만들기 (0) | 2021.09.12 |
달의 일수를 계산하는 프로그램(c언어) (0) | 2021.09.10 |