Search

[-] Critical Section

#include <stdio.h> #include <process.h> #include <Windows.h> int count; int iloopnum = 0; CRITICAL_SECTION hCriticalSection; DWORD WINAPI SectionChildThreadProcedure(LPVOID arglp) { DWORD dThreadId = GetCurrentThreadId(); printf("Thread Id = 0x%08x Before Critical Section Count = %d\n", dThreadId, count); EnterCriticalSection(&hCriticalSection); // Enter Critical Section for (int n = 0; n < (int)arglp; n++) { count++; } LeaveCriticalSection(&hCriticalSection); // Leave Critical Section printf("Thread Id = 0x%08x After Critical Section Count = %d\n", dThreadId, count); return 0; } DWORD WINAPI NoSectionChildThreadProcedure(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; } int CreateThreadFunc(int argv) { HANDLE hChildThread[3]; DWORD dUnusedThreadId; int check = argv; InitializeCriticalSection(&hCriticalSection); // initalized Critical Section printf("Input Loop Num : "); scanf_s("%d", &iloopnum); if (check == 1) { hChildThread[0] = (HANDLE)CreateThread(NULL, 0, NoSectionChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[1] = (HANDLE)CreateThread(NULL, 0, NoSectionChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[2] = (HANDLE)CreateThread(NULL, 0, NoSectionChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); } else if (check == 2) { hChildThread[0] = (HANDLE)CreateThread(NULL, 0, SectionChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[1] = (HANDLE)CreateThread(NULL, 0, SectionChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[2] = (HANDLE)CreateThread(NULL, 0, SectionChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); } 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]); DeleteCriticalSection(&hCriticalSection); 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 = 0x000015e0 Before Nothing Count = 0 Thread Id = 0x00003410 Before Nothing Count = 0 Thread Id = 0x00003c4c Before Nothing Count = 0 Thread Id = 0x000015e0 After Nothing Count = 7315211 Thread Id = 0x00003410 After Nothing Count = 10523194 Thread Id = 0x00003c4c After Nothing Count = 10942567 1. Nothing 2. Set Mutex Input Number : 2 Input Loop Num : 10000000 Thread Id = 0x00003518 Before Critical Section Count = 0 Thread Id = 0x00002f54 Before Critical Section Count = 0 Thread Id = 0x00003a2c Before Critical Section Count = 301601 Thread Id = 0x00003518 After Critical Section Count = 10000000 Thread Id = 0x00002f54 After Critical Section Count = 20000000 Thread Id = 0x00003a2
C++
복사