/*#include<windows.h>
#include<stdio.h>
DWORD WINAPI foo(void *p)
{
DWORD pid = (DWORD)p;
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, 0 ,pid);
if(hProcess == 0)
{
printf("Can't Get Process Handle...\n");
return 0;
}
HANDLE hEvent = OpenEvent(EVENT_ALL_ACCESS,0,"EXIT_EVENT");
HANDLE h[2] = { hProcess,hEvent };
DWORD ret = WaitForMultipleObjects(2,h,FALSE,//둘중에 하나만 시그널 되면
INFINITE);
if(ret == WAIT_OBJECT_0)
{
printf("\n___%d번 프로세스가 종료 되었습니다. __\n",pid);
}
else if(ret == WAIT_OBJECT_0 + 1)
{
printf("EXIT_EVENT가 시그널 되어 종료 합니다.\n");
}
CloseHandle(hEvent);
CloseHandle(hProcess);
return 0;
}
void main()
{
HANDLE hEvent = CreateEvent(0, TRUE, 0, "EXIT_EVENT");
HANDLE hThread[1000];
int Count = 0;
system("ps");
while(1)
{
printf("감시할 프로세스 ID를 넣어 주세요 >> " );
DWORD pid;
scanf("%d", &pid);
if(pid == 1)break;
hThread[Count++] = CreateThread(0, 0, foo, (void *)pid, 0, 0);
CloseHandle(hThread);
}
//대기중인 모든 스레드를 깨운다.
SetEvent(hEvent);
//모든 스레드가 정말로 종료 할때까지 기다린다.
WaitForMultipleObjects(Count,hThread,TRUE, INFINITE);
for(int i = 0 ; i < Count ; i++)CloseHandle(hThread[i]);
}*/
/*
과제
감시 Thread를 만들어서 자고있는 스레드를 깨워서 추가 이벤트를 줘서 하나의 스레드가 64개의 프로세스를 감시하게 만들어라.
*/
/*
네트워크 프로그램들은
주 스레드는 감시만(대기) 하고 누군가 접속을 하면 자식 스레드를 만들어서 전송을 한다.
하지만 스레드를 계속 만드는게 좋을까? -> NO ->스레드수는 줄이고 적은 스레드들이 열개의 일을 할수있게 하는것 -> 스레드 풀링
*/
/*스레드 풀링*/
#include<iostream>
#include<queue>
#include<windows.h>
#include<conio.h>
using namespace std;
//------------------------------------------------------------------------------
//작업의 모양 (결국 작업이란 -> 함수를 의미);
typedef void(*WORK)();
queue<WORK> WORK_Q;
HANDLE hSemaphore;
DWORD WINAPI Thread(void *p)
{
while(1)
{
//작업 Q에 작업 들어오는 것을 대기한다.
WaitForSingleObject(hSemaphore, INFINITE);
WORK f = WORK_Q.front();
WORK_Q.pop();
f();//작업수행
}
return 0;
}
void InitPool(int n)
{
hSemaphore = CreateSemaphore(0,0,1000,"WORK_COUNT");
for(int i = 0; i < n ; ++i)
{
CloseHandle(CreateThread(0,0,Thread,0,0,0));
}
}
void AddWork(WORK f)
{
//작업 Q에 작업(함수주소)를 넣는다.
WORK_Q.push(f);
//세마포어를 증가해서 자고있는 스레드를 깨운다.
LONG old;
ReleaseSemaphore(hSemaphore, 1, &old);
}
//실제 작업함수
CRITICAL_SECTION cs;
void foo()
{
for(int i = 0 ; i < 10 ; i++)
{
EnterCriticalSection(&cs);
printf("%d : %d\n",GetCurrentThreadId(),i);
fflush(stdout);
LeaveCriticalSection(&cs);
Sleep(1000);
}
return ;
}
void main()
{
InitializeCriticalSection(&cs);
InitPool(3);
//5개의 작업을 큐에 넣는다.
AddWork(foo);AddWork(foo);AddWork(foo);AddWork(foo);AddWork(foo);
getch();
DeleteCriticalSection(&cs);
}
/*원자 연산 Atomic operate
하나의 스레드가 하나의 연산의 수행을 끝낼때까지 인터럽트를 발생시키지 않게 한다.
InterlockedIncrement()
*/