Search

[-] Event

#include <stdio.h> #include <process.h> #include <Windows.h> HANDLE hEvent; int count; int iloopnum = 0; DWORD WINAPI EventChildThreadProcedure(LPVOID arglp) { DWORD dwResult = WaitForSingleObject(hEvent, INFINITE); // Waiting Signaled And Auto-Reset Set DWORD dThreadId = GetCurrentThreadId(); printf("Thread Id = 0x%08x Before Event Count = %d\n", dThreadId, count); if (dwResult == WAIT_OBJECT_0) // WaitForSingleObject Check { for (int n = 0; n < (int)arglp; n++) { count++; } } else if (WAIT_FAILED) { printf("Error calling WaitForSingleObject()\n"); return -1; } printf("Thread Id = 0x%08x After Event Count = %d\n", dThreadId, count); SetEvent(hEvent); return 0; } DWORD WINAPI NoEventChildThreadProcedure(LPVOID arglp) { DWORD dThreadId = GetCurrentThreadId(); printf("Thread Id = 0x%08x Before Event Count = %d\n", dThreadId, count); for (int n = 0; n < (int)arglp; n++) { count++; } printf("Thread Id = 0x%08x After Event Count = %d\n", dThreadId, count); return 0; } int EventFunc(void) { HANDLE hChildThread[3]; DWORD dUnusedThreadId; LPCSTR lpcEventName = "nEvent"; hEvent = CreateEvent(NULL, FALSE , TRUE , lpcEventName); // No Duplicate, Auto Reset, Defualt Signal, Name printf("Input Loop Num : "); scanf_s("%d", &iloopnum); hChildThread[0] = (HANDLE)CreateThread(NULL, 0, EventChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[1] = (HANDLE)CreateThread(NULL, 0, EventChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[2] = (HANDLE)CreateThread(NULL, 0, EventChildThreadProcedure, (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]); CloseHandle(hEvent); return 0; } int NonEventFunc(void) { HANDLE hChildThread[3]; DWORD dUnusedThreadId; printf("Input Loop Num : "); scanf_s("%d", &iloopnum); hChildThread[0] = (HANDLE)CreateThread(NULL, 0, NoEventChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[1] = (HANDLE)CreateThread(NULL, 0, NoEventChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); hChildThread[2] = (HANDLE)CreateThread(NULL, 0, NoEventChildThreadProcedure, (LPVOID)iloopnum, 0, &dUnusedThreadId); if (!hChildThread[0] || !hChildThread[1] || !hChildThread[2]) { printf("Error CreateChildThread Error"); return NULL; } DWORD dwResult = WaitForMultipleObjects(3, hChildThread, TRUE, INFINITE); CloseHandle(hChildThread[0]); CloseHandle(hChildThread[1]); CloseHandle(hChildThread[2]); return 0; } int main(void) { int i = 0; while (1) { printf("1. Nothing\n2. Set Event\nInput Number = "); scanf_s("%d", &i); if (i == 1) { NonEventFunc(); return 0; } else if (i == 2) { EventFunc(); return 0; } else { printf("Input legal Value\n"); } } }
C++
복사
1. Nothing 2. Set Event Input Number = 1 Input Loop Num : 10000000 Thread Id = 0x00003564 Before Nothing Count = 0 Thread Id = 0x00005f24 Before Nothing Count = 5007 Thread Id = 0x00005788 Before Nothing Count = 700821 Thread Id = 0x00005f24 After Nothing Count = 6823708 Thread Id = 0x00003564 After Nothing Count = 11919642 Thread Id = 0x00005788 After Nothing Count = 12130188 1. Nothing 2. Set Event Input Number = 2 Input Loop Num : 10000000 Thread Id = 0x00005d8c Before Event Count = 0 Thread Id = 0x00005d8c After Event Count = 10000000 Thread Id = 0x00001684 Before Event Count = 10000000 Thread Id = 0x00001684 After Event Count = 20000000 Thread Id = 0x00005804 Before Event Count = 20000000 Thread Id = 0x00005804 After Event Count = 30000000
C++
복사