#include <stdio.h>
#include <Windows.h>
#include <process.h>
HANDLE hSemaphore;
int count;
int iloopnum = 0;
LONG lSemaphoreCount = 1;
LPLONG lpPreviousCount = &lSemaphoreCount;
DWORD WINAPI NoSemaphoreChildThreadProcedure(LPVOID arglp)
{
DWORD dThreadId = GetCurrentThreadId();
printf("Thread Id = 0x%08x Before Nothing Count = %d\n", dThreadId, count);
for (int n = 0; n < (int)arglp; n++)
{
count++;
}
printf("Thread Id = 0x%08x After Nothing Count = %d\n", dThreadId, count);
return 0;
}
DWORD WINAPI SemaphoreChildThreadProcedure(LPVOID arglp)
{
DWORD dThreadId = GetCurrentThreadId();
printf("Before Semaphore PreviousCount= %d\n", *lpPreviousCount);
DWORD dwResult = WaitForSingleObject(hSemaphore, INFINITE); // Waiting Signaled
printf("Thread Id = 0x%08x Before Semaphore Count = %d\n", dThreadId, count);
for (int n = 0; n < (int)arglp; n++)
{
if (dwResult == WAIT_OBJECT_0) // WaitForSingleObject Check
{
count++;
}
else
{
printf("Error calling WaitForSingleObject()\n");
return -1;
}
}
printf("Thread Id = 0x%08x After Semaphore Count = %d\n", dThreadId, count);
ReleaseSemaphore(hSemaphore,1,lpPreviousCount);
printf("After Semaphore PreviousCount= %d\n", *lpPreviousCount);
return 0;
}
int CreateThreadFunc(int argv)
{
HANDLE hChildThread[3];
DWORD dUnusedThreadId;
int check = argv;
hSemaphore = CreateSemaphore(NULL, lSemaphoreCount, 5 ,NULL); // Create Semaphore Object
printf("Input Loop Num : ");
scanf_s("%d", &iloopnum);
if (check == 1)
{
hChildThread[0] = (HANDLE)CreateThread(NULL, 0, NoSemaphoreChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId);
hChildThread[1] = (HANDLE)CreateThread(NULL, 0, NoSemaphoreChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId);
hChildThread[2] = (HANDLE)CreateThread(NULL, 0, NoSemaphoreChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId);
}
else if (check == 2)
{
hChildThread[0] = (HANDLE)CreateThread(NULL, 0, SemaphoreChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId);
hChildThread[1] = (HANDLE)CreateThread(NULL, 0, SemaphoreChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId);
hChildThread[2] = (HANDLE)CreateThread(NULL, 0, SemaphoreChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId);
}
else
{
printf("check = %d Is illegal Value\n",check);
return 0;
}
if (!hChildThread[0] || !hChildThread[1] || !hChildThread[2])
{
printf("Error CreateChildThread Error");
return NULL;
}
DWORD dwResult = WaitForMultipleObjects(3, hChildThread, TRUE, INFINITE);
if (dwResult != WAIT_OBJECT_0)
{
printf("Error WaitForMultipleObject()");
return 0;
}
CloseHandle(hChildThread[0]);
CloseHandle(hChildThread[1]);
CloseHandle(hChildThread[2]);
CloseHandle(hSemaphore);
return 0;
}
int main(void)
{
int i = 0;
while (1)
{
printf("1. Nothing\n2. Set Semaphore\nInput Number : ");
scanf_s("%d", &i);
if (i == 1 || i == 2)
{
CreateThreadFunc(i);
return 0;
}
else
{
printf("Input legal Value\n");
}
}
}
C++
복사
1. Nothing
2. Set Semaphore
Input Number : 1
Input Loop Num : 10000000
Thread Id = 0x00005eb8 Before Nothing Count = 0
Thread Id = 0x000060cc Before Nothing Count = 12737
Thread Id = 0x00001450 Before Nothing Count = 66626
Thread Id = 0x000060cc After Nothing Count = 7644709
Thread Id = 0x00005eb8 After Nothing Count = 10635012
Thread Id = 0x00001450 After Nothing Count = 12379750
1. Nothing
2. Set Semaphore
Input Number : 2
Input Loop Num : 10000000
Before Semaphore PreviousCount= 1
Thread Id = 0x00006084 Before Semaphore Count = 0
Before Semaphore PreviousCount= 1
Before Semaphore PreviousCount= 1
Thread Id = 0x00006084 After Semaphore Count = 10000000
After Semaphore PreviousCount= 0
Thread Id = 0x00005d68 Before Semaphore Count = 10000000
Thread Id = 0x00005d68 After Semaphore Count = 20000000
After Semaphore PreviousCount= 0
Thread Id = 0x000061c0 Before Semaphore Count = 20000000
Thread Id = 0x000061c0 After Semaphore Count = 30000000
After Semaphore PreviousCount= 0
C++
복사