// 세마포어
/*#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);
}