2010. 1. 12. 09:59
동기화 - 스레드간의 실행 순서를 제어 할 수 있는 기술
Loop : 자원 사용중
Mutax(상호배제)
신호상태 - 커널객체를 사용 할 수있는 상태
비신호상태 - 커널객체를 사용 할 수없는 상태
WaitForSingleObject(HANDLE hHAndle, DWORD dwMilliseconds); //hHandle 이 지정하는 하나의 동기화 객체가 신호상태가 되기를 기다린다.
두번째 인자를 INFINITE로 지정하면 무한정 기다린다.
HANDLE CreateMutex(null, bool, lpName (뮤텍스를 구분하기위함)); //통상 프로그램 시작시
OpenMutex
CloseHandle(handle); //죵료시
비신호상태로 만들겠다 내가 점유하지 않은상태에서 만들겠다.
if(GetLastError() == ERROR_ALREADY_EXISTED) // 이면 이미 프로그램이 가동중이다.
HANDLE hMu = CreateMutex(null, false, "hello");
{
세마포어 - 제한된 일정 개수를 가지는 자원을 보호하고 관리(뮤텍스와 유사하나 다수의 갯수를 관리)
HANDLE CreateSemaphore(보호기술자, 5(최대사용개수), 5(count초기값), 세마포어를 구분하기위한 문자열);
이벤트
HANDLE CreateEvent(보안기술자, ManualReset(자동이냐 수동이냐), bInitialState ,
Loop : 자원 사용중
(1) ConTex Switching 이 발생? Atomic Operation
자원을 비 신호 상태로
---------------------------
---------------------------
Doit 임계구간(Critical Section) - Race condition을 방지
---------------------------
자원을 신호 상태로
ConTex Switching를 허용안하는 방법 - 타임인터럽트를 Disable하면 되지만 사용자 수준에서는 변경이 힘들다.
CRITICAL_SECTION cs;
자원을 신호 상태로
ConTex Switching를 허용안하는 방법 - 타임인터럽트를 Disable하면 되지만 사용자 수준에서는 변경이 힘들다.
CRITICAL_SECTION cs;
Initialize CriticalSection(&cs); //프로그램시작시
while(1)
{
while(1)
{
-----------------
if(flag)
{
flag = false; Atomic 하게 만들었다.
doit();
{
flag = false; Atomic 하게 만들었다.
doit();
------------------
flag=true;
break;
}
break;
}
}
DeleteCriticalSection(&cs) //종료시
DeleteCriticalSection(&cs) //종료시
Mutax(상호배제)
신호상태 - 커널객체를 사용 할 수있는 상태
비신호상태 - 커널객체를 사용 할 수없는 상태
WaitForSingleObject(HANDLE hHAndle, DWORD dwMilliseconds); //hHandle 이 지정하는 하나의 동기화 객체가 신호상태가 되기를 기다린다.
두번째 인자를 INFINITE로 지정하면 무한정 기다린다.
HANDLE CreateMutex(null, bool, lpName (뮤텍스를 구분하기위함)); //통상 프로그램 시작시
OpenMutex
CloseHandle(handle); //죵료시
비신호상태로 만들겠다 내가 점유하지 않은상태에서 만들겠다.
if(GetLastError() == ERROR_ALREADY_EXISTED) // 이면 이미 프로그램이 가동중이다.
HANDLE hMu = CreateMutex(null, false, "hello");
{
if(get)
{
closeHandle(hMu) //시작시 한번 들어오고 다음 스레드는 여기서 해제시킨다.
return;
{
closeHandle(hMu) //시작시 한번 들어오고 다음 스레드는 여기서 해제시킨다.
return;
}
}
세마포어 - 제한된 일정 개수를 가지는 자원을 보호하고 관리(뮤텍스와 유사하나 다수의 갯수를 관리)
HANDLE CreateSemaphore(보호기술자, 5(최대사용개수), 5(count초기값), 세마포어를 구분하기위한 문자열);
// 세마포어 카운트가 다 차야 비신호 상태가 된다.
이벤트
HANDLE CreateEvent(보안기술자, ManualReset(자동이냐 수동이냐), bInitialState ,
WaitForSingleObject(handle, INFINITE);
{
dout();
SetEvent(handle);
}
dout();
SetEvent(handle);
}
// ManualReset - True 이면 Set을 안한다!무한정 기다리기만 한다.
// SetEvent(hwnd); 이 필요
// SetEvent(hwnd); 이 필요
SetEvent() //이벤트를 신호상태로
ResetEvent() //이벤틀를 비신호상태로
ResetEvent() //이벤틀를 비신호상태로
'API & MFC > API & 시스템프로그래밍' 카테고리의 다른 글
서비스 (0) | 2010.01.13 |
---|---|
IPC란? (0) | 2010.01.12 |
디폴트 함수 (0) | 2010.01.04 |
API (원 가지고 놀기) (0) | 2010.01.04 |
API란? (0) | 2010.01.04 |