쓰레드 동기화기법 - CriticalSection/Mutex/Semaphore/Event
* CriticalSection (크리티컬섹션)
: 유저모드 동기화 기법
사용시 프로세스의 실행 모드가 유저모드에서 커널모드로의 전환이 필요 없다보니
속도가 빠르며, 구현방법이 쉽다.
- 하나의 프로세스 내에서 동기화하기 위하여 사용되어진다.
* Mutex/Semaphore/Event (뮤텍스/세마포어/이벤트)
: 커널모드 동기화 기법
사용시 프로세스의 실행 모드가 유저모드에서 커널모드로 전환이 발생한다.
둘이상의 프로세스 내에 존재하는 쓰레드 간의 공기화가 가능하다.
- Mutex
: 여러 프로세스 사이에서도 동기화를 진행할 수 있다.
- Semaphore
: 여러 프로세스 사이에서도 동기화를 진행할 수 있다.
한번에 하나의 쓰레드가 아닌 한번에 여러개의 쓰레드를
임계영역내의 작업을 허용할 수 있다.
# CriticalSection
====================================================================
CRITICAL_SECTION CR;
InitializeCriticalSection(&CR);
EnterCriticalSection(&CR);
// ...
LeaveCriticalSection(&CR);
DeleteCriticalSection(&CR);
====================================================================
# Mutex
====================================================================
HANDLE WINAPI CreateMutex(
_In_opt_ LPSECURITY_ATTRIBUTES lpMutexAttributes,
_In_ BOOL bInitialOwner,
_In_opt_ LPCTSTR lpName
);
====================================================================
: Mutex 사용예
HANDLE hMux = CreateMutex(NULL, FALSE, _T("Mutex Name"));
ReleaseMutex(hMux);
CloseHandle(hMux);
# Semaphore
====================================================================
HANDLE WINAPI CreateSemaphore(
_In_opt_ LPSECURITY_ATTRIBUTES lpSemaphoreAttributes,
_In_ LONG lInitialCount,
_In_ LONG lMaximumCount,
_In_opt_ LPCTSTR lpName
);
====================================================================
: Semaphore 사용예
HANDLE hMux = CreateSemaphore(NULL, 2, 2, NULL);
WaitForSingleObject(hMux, INFINITE);
...
ReleaseSemaphore(hMux, 1, NULL);
CloseHandle(hMux);
# Event
====================================================================
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
====================================================================
: Event 사용예
HANDLE hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
SetEvent(hEvent);
ReSetEvent(hEvent);
CloseHandle(hEvent);
'■ 프로그래밍, 개발' 카테고리의 다른 글
해상도 크기 비교 (0) | 2016.07.18 |
---|---|
Override 와 Virtual 의 차이와 의미 (0) | 2014.03.09 |
fopen_s,fread,fwrite,fclose 사용법 (0) | 2014.02.18 |
쓰레드의 진실 - CreateThread,_beginthread,_beginthreadex,AfxBeginThread (0) | 2014.02.18 |
BSD(Berkeley Software Distribution) - 버클리 소프트웨어 배포 (0) | 2014.02.03 |
댓글