Critical Section
크리티컬 섹션을 사용하는 이유.
속도가 뮤텍스나 세마포어보다 빠르다.
동기화시 가장 주의할 점은 DeadLock이다
한 프로세스 안에서만 사용이 가능하다.
CRITICAL_SECTION m_CriticalSection;
InitializeCriticalSection( &m_CriticalSection );
DeleteCriticalSection( &m_CriticalSection );
EnterCriticalSection( &m_CriticalSection );
LeaveCriticalSection( &m_CriticalSection );
Mutex
뮤텍스는 크리티컬 섹션과 비슷해서 크리티컬 섹션이 쓰이는 곳에 대신 사용할 수 있다.
그리고 이름을 갖고 있으므로 다른 프로세스에서도 사용이 가능하다.
하지만 속도는 더 느리다.
HANDLE hMutex;
hMutex = CreateMutex( NULL, FALSE, NULL );
ReleaseMutext( hMutex );
WaitForSingleObject( hMutex, INFINITE );
Semaphore
세마포어는 뮤텍스와 유사한 동기화 객체이다. 물론 차이점이 있다. 뮤텍스는 하나의 공유 자원을 보호하기 위해 사용하지만 세모포어는 제한된 일정 개수를 가지는 자원을 보호하고 관리한다. 여기서 자원이라 함은 상당히 추상적이지만 그것이 하드웨어일 수도 윈도우 프로세스, 스레드와 같은 소페트웨어적인 것을 수도 있다.
HANDLE hSemaphore = ( HANDLE )CreateSemaphore( NULL, 3, 3, NULL );
WaitForSingleObject( hSemaphore, INFINITE );
ReleaseSemaphore( hSemaphore, 1, NULL );
HANDLE CreateSemaphore( LPSECURTY_ATTRIBUTES lpSemaphoreAttributes, LONG lInitialCount, LONG lMaximumCount, LPCSTR lpName );
lMaximumCount 는 최대 사용 개수 lInitialCount = 초기값
HANDLE OpenSemaphore( DWORD dwDesiredAccess, BOOL bInheritHandle, LPCTSTR lpName );
OpenSemaphore 함수로 세마포어의 핸들을 구할 수 있다.
OpenSemaphore(SYNCHRONIZE, FALSE, "MySemaphore");
BOOL ReleaseSemaphore( HANDLE hSemaphore, LONG lReleaseCount, LPLONG lpPreviousCount );
자원의 사용이 끝난 스레드는 이 함수를 호출하여 사용 종료를 세마포어에 알려야 한다. lReleaseCount 로 자신이 사용한 자원의 개수를 알리는데 하나만 사용했으면 이 값은 1이고 만약 여러개를 사용했으면 사용한 만큼 자원을 풀어줘야 한다. 세번째 함수는 이전 카운트를 리턴받기 위한 참조 인수이다.
파괴 void CloseHandle( HANDLE );
// 세마포어의 카운트를 조사하는 함수
int RetSemaCount( HANDLE hSema )
{
int result;
int count;
result = WaitForSingleObject( hSema, 0 );
if( result == WAIT_TIMEOUT )
return 0;
ReleaseSemaphore( hSema, 1, &count );
return count +1;
}