Search

[-] Mutex

#include <stdio.h> #include <process.h> #include <Windows.h> HANDLE hMutex; int count; int iloopnum = 0; DWORD WINAPI NoMutexChildThreadProcedure(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 MutexChildThreadProcedure(LPVOID arglp) { DWORD dThreadId = GetCurrentThreadId(); DWORD dwResult = WaitForSingleObject(hMutex, INFINITE); // Waiting Signaled printf("Thread Id = 0x%08x Before Mutex 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 Mutex Count = %d\n", dThreadId, count); ReleaseMutex(hMutex); return 0; } int CreateThreadFunc(int argv) { HANDLE hChildThread[3]; DWORD dUnusedThreadId; int check = argv; hMutex = CreateMutex(NULL, FALSE, NULL); // Create mutex Object printf("Input Loop Num : "); scanf_s("%d", &iloopnum); while (1) { if (check == 1) { hChildThread[0] = (HANDLE)CreateThread(NULL, 0, NoMutexChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[1] = (HANDLE)CreateThread(NULL, 0, NoMutexChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[2] = (HANDLE)CreateThread(NULL, 0, NoMutexChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); break; } else if (check == 2) { hChildThread[0] = (HANDLE)CreateThread(NULL, 0, MutexChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[1] = (HANDLE)CreateThread(NULL, 0, MutexChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[2] = (HANDLE)CreateThread(NULL, 0, MutexChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); break; } else { printf("check = %d Is illegal Value\n"); } } 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(hMutex); return 0; } int main(void) { int i = 0; while (1) { printf("1. Nothing\n2. Set Mutex\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 Mutex Input Number : 1 Input Loop Num : 10000000 Thread Id = 0x000011d0 Before Nothing Count = 0 Thread Id = 0x00003c54 Before Nothing Count = 0 Thread Id = 0x00002508 Before Nothing Count = 220182 Thread Id = 0x00003c54 After Nothing Count = 5503605 Thread Id = 0x000011d0 After Nothing Count = 8950656 Thread Id = 0x00002508 After Nothing Count = 12777291 1. Nothing 2. Set Mutex Input Number : 2 Input Loop Num : 10000000 Thread Id = 0x00000ab0 Before Mutex Count = 0 Thread Id = 0x00000ab0 After Mutex Count = 10000000 Thread Id = 0x0000057c Before Mutex Count = 10000000 Thread Id = 0x0000057c After Mutex Count = 20000000 Thread Id = 0x0000360c Before Mutex Count = 20000000 Thread Id = 0x0000360c After Mutex Count = 30000000
C++
복사