본문 바로가기
IT창고/System

세마포어/뮤텍스/이벤트

by 창구창고 2007. 1. 22.
반응형
// 세마포어
/*#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);
}
반응형

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."