wiki: 크리티컬섹션, 뮤텍스, 세마포어의 차이
- initial version: 2007.08.12
- 계속 쭈~욱 가는거야님이 크리티컬섹션, 뮤텍스, 세마포어의 차이에 대해서 간단히 잘 정리해주셔서 그 내용을 포스팅합니다.
[edit]
1 Richter 책에 있는 표 #
Object | When Nonsignaled | When Signaled | Successful Wait Side Effect |
Semaphore | Successful wait | When count>0 (ReleaseSemaphore) |
Decrements count by 1 |
Mutex | Successful wait | When unowned by a thread (ReleaseMutex) |
Gives ownership to thread |
Critical | Successful wait (EnterCriticalSection) |
When unowned by a thread (LeaveCriticalSection) |
Gives ownership to thread |
[edit]
2 크리티컬섹션 (Critical section) #
유저모드 동기화 객체
커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에 스레드 동기화에 사용할 수 있다.
EnterCriticalSection을 호출하면 객체는 비신호 상태가 되고,
LeaveCriticalSection을 호출하면 신호상태로 바뀌어서 다른 스레드들이 접근가능하다.
커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에 스레드 동기화에 사용할 수 있다.
EnterCriticalSection을 호출하면 객체는 비신호 상태가 되고,
LeaveCriticalSection을 호출하면 신호상태로 바뀌어서 다른 스레드들이 접근가능하다.
[edit]
3 뮤텍스 (Mutex) #
커널모드 동기화 객체
커널모드라서 크리티컬 섹션보다는 느리지만 프로세스를 넘어서 모든 스레드에 사용 될 수 있는 동기화 객체이다.
뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.
ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른 스레드들이 접근가능하다.
커널모드라서 크리티컬 섹션보다는 느리지만 프로세스를 넘어서 모든 스레드에 사용 될 수 있는 동기화 객체이다.
뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.
ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른 스레드들이 접근가능하다.
[edit]
4 세마포어 (Semaphore) #
커널모드 동기화 객체
뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다.
세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트값은 3이다.
객체 내부적으로 카운트를 관리하여 세마포어 객체를 Wait하는 스레드가 있으면 카운트가 하나씩 감소한다. 그래서 내부카운트가 0이되면 비신호상태로 바뀐다. [[br] 세마포어를 사용하고 있는 스레드들중 ReleaseSemaphore 하면 세마포어 내부카운트는 다시 1 증가하여 신호상태로 바뀌어서 다른 스레드들이 사용가능하게 된다.
뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다.
세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트값은 3이다.
객체 내부적으로 카운트를 관리하여 세마포어 객체를 Wait하는 스레드가 있으면 카운트가 하나씩 감소한다. 그래서 내부카운트가 0이되면 비신호상태로 바뀐다. [[br] 세마포어를 사용하고 있는 스레드들중 ReleaseSemaphore 하면 세마포어 내부카운트는 다시 1 증가하여 신호상태로 바뀌어서 다른 스레드들이 사용가능하게 된다.
※ 세마포어 생성 시 접근 가능한 스레드를 0으로 설정해서 WaitforSingleObject와 같은 효과를 내어서 사용하기도 하죠.
Trackback Logs
'◆ 무한한 가능성 > & Programming' 카테고리의 다른 글
[펌글] eXtreme Programming (0) | 2009.01.12 |
---|---|
[펌글] SOCK_STREAM 소켓의 특성 (0) | 2009.01.12 |
[펌글] 소스 분석 방법 (0) | 2009.01.12 |
윈도우단축키 :: win키 + 응용키 (0) | 2009.01.12 |
[펌글] 소스 인사이트 단축키 (0) | 2009.01.12 |