[-] Semaphore

#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++
복사