커널 오브젝트의 상태
1. Mutex 기준으로…
- signaled상태 -> 소유가 가능한 상태.
- non-signaled 상태 -> 이미 소유되어진 상태.
2. Semaphore 기준으로…
- signaled상태 -> 세마포어 카운트가 0이 아닌 경우.
- non-signaled 상태 -> 세마포어 카운트가 0인 경우.
커널 오브젝트 동기화 기법 1 (Mutex)
- HANDLE CreateMutex(
- LPSECURITY_ATTRIBUTES lpMutexAttributes, // SD
- BOOL bInitialOwner, // initial owner(false for signaled)
- LPCTSTR lpName // object name
- );
- BOOL ReleaseMutex(
- HANDLE hMutex // non-signaled -> signaled
- );
- BOOL CloseHandle( HANDLE hObject // handle to object );
1. CreateMutex - 뮤텍스 생성
2. _beginthreadex - 쓰레드 생성
3. 쓰레드 루프
- WaitForSingleObject(hMutex) - 뮤텍스 받음
- ReleaseMutex - 뮤텍스 반환
4. WaitForSingleObject(hThread) - 쓰레드 종료를 기다림
5. CloseHandle(hMutex) - 뮤텍스 소멸
커널 오브젝트 동기화 기법 2 (Semaphore)
세마포어의 특징
- 세마포어가 0이 되어야 세마포어 오브젝트가 non-signaled 상태가 된다.
- HANDLE CreateSemaphore(
- LPSECURITY_ATTRIBUTES lpSemaphoreAttributes, // SD
- LONG lInitialCount, // initial count
- LONG lMaximumCount, // maximum count
- LPCTSTR lpName // object name
- );
- BOOL ReleaseSemaphore(
- HANDLE hSemaphore, // handle to semaphore
- LONG lReleaseCount, // count increment amount
- LPLONG lpPreviousCount // previous count
- );
- BOOL CloseHandle( HANDLE hObject // handle to object );
이번 예제는 코드가 많은 관계로 아래의 소스코드를 첨부합니다.
1. CreateSemaphore - 세마포어 생성
2. _beginthreadex - 쓰레드 생성
3. 쓰레드 루프
- WaitForSingleObject(hSem) - 세마포어 받음
- ReleaseSemaphore - 세마포어 반환
4. WaitForSingleObject(hThread) - 쓰레드 종료를 기다림
5. CloseHandle(hSem) - 세마포어 소멸
뮤텍스와 구성은 똑같습니다만,
뮤텍스는 현재 소유권을 가진(점유중인) 쓰레드만이 뮤텍스 반환의 권한을 가집니다.
반면, 세마포어는 현재 소유권을 가진 쓰레드가 아니더라도,
ReleaseSemaphore 함수로 누구든지 세마포어를 반환할 수있습니다.
결국 소유권의 차이입니다.
그리고 제가 MFC 를 공부했을 때에도 뮤텍스와 세마포어가 있었습니다.
MFC 세마포어는 특정영역을 수행하는 쓰레드의 개수를 지정할 수 있습니다.
특정영역을 한 번에 하나의 쓰레드만 접근하는 것이 아니라,
여러개의 세마포어를 둘 수 있었구요.
Event의 특징
- auto & manual–reset 모드의 커널 오브젝트의 생성이 가능하다.
바로, Non-signaled 에서 Signaled 상태로 바뀔 때,
대기중인 모든 쓰레드를 동시에 깨운다는 것이져.
1. CreateEvent - 이벤트 생성
2. _beginthreadex - 쓰레드 생성
3. 쓰레드 루프
- WaitForSingleObject(hEvent) - 이벤트 받음
(SetEvent - 이벤트 non-signaled -> signaled 전환)
(ResetEvent - 이벤트 signaled -> non-signaled 전환)
4. WaitForSingleObject(hThread) - 쓰레드 종료를 기다림
5. CloseHandle(hEvent) - 이벤트 소멸
출처는 역시 윤성우 선생님의 TCP/IP 프로그래밍입니다.
[출처] http://thx4alice.tistory.com/85
'DEV-Language > NetWorkServer Programming' 카테고리의 다른 글
소켓 관련 API후킹자료 (0) | 2009.01.31 |
---|---|
게임서버프로그래머가 되는길 (0) | 2009.01.30 |
tcp와udp의 공통점/차이점 (0) | 2009.01.23 |
온라인게임 서버 프로그래밍 벤치마크 (0) | 2009.01.21 |
WSAIoctl, SIO_KEEPALIVE_VALS 참고 사이트들 (0) | 2009.01.21 |