본문 바로가기
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);
    }
    
    반응형

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