본문 바로가기
■ 프로그래밍, 개발

쓰레드 동기화기법 - CriticalSection/Mutex/Semaphore/Event

by 토크맨 2014. 2. 18.
반응형

쓰레드 동기화기법 - 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);

 

 

 

 

 

 

반응형

댓글