반응형
// 세마포어
/*#include<windows.h> #include<stdio.h> void main() { HANDLE hSemaphore = CreateSemaphore(0, //보안 3, //Count초기값 3, //최대카운트 "s"); //이름 printf("세마포어를 대기합니다.\n"); WaitForSingleObject(hSemaphore,INFINITE); //++Count printf("세마포어를 획득\n"); MessageBox(0,"Release??","",MB_OK); LONG old; ReleaseSemaphore(hSemaphore,1,&old); CloseHandle(hSemaphore); //리소스 카운팅 //세마포어는 카운트 초기값과 최대카운트가있다. //세마포어는 if(카운트)시그널 이다. //카운트는 WaitForSingleObject()를 통과할때마다 --Count된다. 0이면 NONSIGNAL //카운트틑 0보다 커야 하며 최다값보다 작아야 한다. //ReleaseSemaphore() 세마포어 카운트 증가 }*/ /* #include<windows.h> #include<iostream> #include<queue> #include<time.h> using namespace std; queue<int> Q; //2개의 스레드가 동시에 사용하는 공유자원 HANDLE hMutex; //Q에 접근을 동기화 하기 위해 Mutex사용(크리티컬 섹션이 더 좋긴 하지만 Mutex예제를 위해 HANDLE hSemaphore; LONG old; //생산자 DWORD WINAPI Produce(void *) { static int value = 0; while(1) { //Q에 생산을 한다. ++value; //Q에 대한 독점권을 얻는다. WaitForSingleObject(hMutex,INFINITE); //------------------------------------------ Q.push(value); printf("Produce : %d\n",value); //------------------------------------------ ReleaseSemaphore(hSemaphore, 1 ,&old); //세마포어 갯수를 증가한다. ReleaseMutex(hMutex); Sleep( (rand()% 20) * 100); //0,1~2초간 대기 } return 0; } DWORD WINAPI Consume(void *) { while(1) { //Q에 생산을 한다. WaitForSingleObject(hSemaphore,INFINITE); //Q가비어있다면 대기 WaitForSingleObject(hMutex,INFINITE); //뮤텍스와 세마포어의 대기 위치기 바뀌면 데드락에 걸린다. //------------------------------------------ int n = Q.front(); Q.pop(); printf("\tConsume : %d\n",n); //------------------------------------------ ReleaseMutex(hMutex); Sleep( (rand()% 20) * 100) ; //0,1~2초간 대기 } return 0; } void main() { hMutex = CreateMutex(0, FALSE , "Q_ACCESS_GUARD"); hSemaphore = CreateSemaphore(0, 0, 1000 , "Q_ACCESS_COUNT"); srand( time(0)); HANDLE h[2]; h[0] = CreateThread(0, 0, Produce, 0, 0, 0); h[1] = CreateThread(0, 0, Consume, 0, 0, 0); WaitForMultipleObjects(2,h,TRUE,INFINITE); CloseHandle(h[0]); CloseHandle(h[1]); CloseHandle(hMutex); CloseHandle(hSemaphore); }*/ #include<windows.h> #include<stdio.h> void main() { HANDLE hEvent = CreateEvent(0, //보안 TRUE, //Reset의 종류(F:auto ,T:manual) FALSE, //초기 signal 상태 "e"); //이름 printf("Event를 대기 합니다.\n"); WaitForSingleObject(hEvent,INFINITE); printf("Event 획득\n"); WaitForSingleObject(hEvent,INFINITE); printf("Event 획득\n"); CloseHandle(hEvent); } /* ┌────────────┐ │ 보 안 0 │ ├────────────┤ │ 시 그 널 0 │ ├────────────┤ │ 참 조 1 │ ├────────────┤ │ " e" │ ├────────────┤ │ 리셋종류 auto │ └────────────┘ -> 다른 프로그램에서 깨워줘야 한다.->통신이다. autoreset : Wait통과시 자동으로 Nonsignal로 변경 manualrest : Wait통과시 signal불변 HANDLE h1 = CreateEvent(0, FALSE, 0, "e"); -> Create HANDLE h2 = CreateEvent(0, FALSE, 0, "e"); -> Open (이름이 같다) HANDLE h3 = CreateEvent(0, TRUE, 0, "e"); -> 기존Create의 상태로 Open(같은이름일경우) 1,2,3인자는 Create인경우만 동작한다. Open이경우 무시(같은이름인 경우 Open) HANDLE h3 = CreateMutex(0,0,"e"); <- fail : Kernel은 같은 namespace를 사용하기 때문에 같은이름의 다른 생성이므로 실패한다 -> 생성시 이름을 복잡하게 해야한다. */
#include<windows.h> #include<stdio.h> #include<conio.h> void main() { HANDLE hEvent = CreateEvent(0, 0, 0, "e"); while(1) { getch(); //SetEvent(hEvent); PulseEvent(hEvent); //pulse이벤트 모든 대기중인 이벤트를 깨운다 깨운후 바로 리셋한다. } CloseHandle(hEvent); }
반응형
"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."