이글은 '선문비트 고급과정'에서 강의받은 내용을 토대로 작성하였으며, 비트 교육센터 자료를 참고하여 올린내용입니다.
문제가 될시 삭제가 될 수 있습니다.
작성날짜 : 2011-03-16 |
CriticalSection | 뮤텍스 | 세마포어 | 이벤트 |
매커니즘 (CRITICALSECTION cs) | 동 객 | 동 객 | 동 객 |
InitializeCriticalSection | CreateMutex | CreateSemaphore | CreateEvent |
ReleaseCriticalSection | CloseHandle | CloseHandle | CloseHandle |
EnterCriticalSection | WaitForSingleObject | WaitForSingleObject | WaitForSingleObject |
LeaveCriticalSection | ReleaseMutex | ReleaseSemaphore | SetEvent |
하나의 프로세스 내 (변수) | 하나의 System (문자열) | 하나의 System (문자열) | 하나의 System (문자열) |
| 상호 배제 (상호 배제를 쓸경우 CloseHandle과 WaitForSingleObject를 쓸 기연성이 없다) | N 개의 자원 | 병렬처리 (다른 스레드가 사용이 끝났는지 확인) |
매커니즘
Critical Section
자원경쟁 문제가 있을 때 자원경쟁이 일어나는 구간
// 하나의 같은 프로세서에서만 사용 가능.
CriticalSection cs;
// 자원 경쟁이 일어날 수 있다.
InitializeCreticalSection(&cs); // 초기화하면 이후부터 크리티컬 섹션을 사용할 수 있다.
DeleteCreticalSection(&cs); // 크리티컬 섹션 파괴
EnterCriticalSection(&cs); // 다른 스레드가 같은 크리티컬 섹션에 들어올 수 없음
// WaitForsingleObject(hMu,INFINITE) // 하나의 동기화 객체를 기다리는 대기 함수.
LeadceCriticalSection(&cs); // 크리티컬 섹션 해제(다른 스레드가 사용가능)
// ReleaseMutex(hMu);
// 서로 다른 프로세서라면..
뮤텍스
상호배제적으로 사용할 때 쓴다(누군가 쓰고 있다면 안 쓰고, 안 쓸 경우 쓴다)
void main()
{
HANDLE hMu;
hMu = CreateMutex(0,false,L"Hello");
// 0 : 보안속성 설정 (보통 0)
// false : 생성함과 동시에 소유할 것인지를 지정
// L"Hello" : 뮤텍스 이름을 지정
if(GetLastError() == ERROR_ALREADY_EXISTS)
{
CloseHandle(hMu);
return;
}
// to do
CloseHandle(hMu);
}
// n개의 자원 개수가지고 자원경쟁을 할때에도 사용할 수 있다.
// 같은 프로세서가 아니더라도 사용 가능.
세마 포어
유닉스에서 count 세마포어를 일컬음
HANDLE hSema;
hSema = CreateSemaphore(0,3,3,L"Hello");
0 :
3 : 현재 사용할 수 있는 개수
3 : 최대 사용 개수
L"Hello" : 세마포어의 이름
DWORD sc;
WaitForSingleObject(hSema, INFINITE); // INFINITE 값 -1 이라서 무한대기 상태
ReleaseSemaphore(hSema, 1, &sc); // 세마포어 반납
이벤트
자동 리셋 이벤트 // Critical Section과 동일 하게 사용시 사용
수동 리셋 이벤트
HANDLE hEvent;
hEvent = CreateEvent(0,false,false,L"Hello");
// 0 :
// flase : 수동인지 자동인지 설정
// flase : 생성함과 동시에 신호상태로 만들지 비 신호 상태로 만들지 설정
// L"Hello" : Event의 이름
CloseHandle(hEvent);
삽질 Thread
ReSetEvent(hEvent);
삽질 후 작업
WaitForSingleObject(hEvent,INFINITE);
'Programming > Win32 API' 카테고리의 다른 글
[Win32 API] Win32 API, Window와 Unix (0) | 2015.05.11 |
---|---|
[Win32 API] 컨트롤도 윈도우다 (0) | 2015.05.11 |
[Win32 API] 동기화 (0) | 2015.05.11 |
[Win32 API] CreateFile 함수 (0) | 2015.05.11 |
[Win32 API] SetFilePointer (0) | 2015.05.11 |