관리자sep글쓰기
 
툴바 보기

notice

categories

분류 전체.. (63)
흔적따라가기 (27)
일상이야기 (36)

recent posts

recent comments

recent trackbacks

보조윈도우 감추기

links

      fotowall blackmind
보조윈도우 보기/감추기

Object         When Nonsignaled   When Signaled                     Successful Wait Side Effect

Semaphore  Successful wait       When count>0                      Decrements count by 1
                                               (ReleaseSemaphore)  
Mutex         Successful wait       When unowned by a thread   Gives ownership to thread
                                               (ReleaseMutex)
Critical        Successful wait       When unowned by a thread   Gives ownership to thread
                (EnterCriticalSection)  (LeaveCriticalSection)

위는 Richter 책에 있는 표를 인용했다.

1. 크리티컬 섹션
유저모드 동기화 객체이다. 커널모드 객체가 아니기 때문에 가볍고 같은 프로세스내에
스레드 동기화에 사용할 수 있다. EnterCriticalSection을 호출하면 객체는 비신호 상태가 되고
LeaveCriticalSection을 호출하면 신호상태로 바뀌어서 다른 스레드들이 접근가능하다.

2. 뮤텍스
커널모드 동기화 객체이다. 커널모드라서 크리티컬 섹션보다는 느리지만 프로세스를 넘어서
모든 스레드에 사용될 수 있는 동기화 객체이다. 뮤텍스를 신호상태로 생성한 후 스레드에서 Wait 함수를 호출하면 뮤텍스는 비신호 상태가 되어서 다른 스레드에서는 접근하지 못한다.
ReleaseMutex를 호출하면 뮤텍스는 신호상태가 되어 다른 스레드들이 접근가능하다.

3. 세마포어
커널모드 동기화 객체이다. 뮤텍스와 비슷하지만 접근할 수 있는 스레드 갯수를 정할 수 있다.
세마포어를 생성할 때 3개의 스레드들이 접근가능하도록 지정하면 내부카운트값은 3이다.
객체 내부적으로 카운트를 관리하여 세마포어 객체를 Wait하는 스레드가 있으면 카운트가
하나씩 감소한다. 그래서 내부카운트가 0이되면 비신호상태로 바뀐다. 세마포어를 사용하고
있는 스레드들중 ReleaseSemaphore 하면 세마포어 내부카운트는 다시 1 증가하여
신호상태로 바뀌어서 다른 스레드들이 사용가능하게 된다.

저도 잘 모르고 알기 귀찮았던 동기화 객체를 한번 정리 했습니다.
스레드 동기화 객체는 모두 알아두면 좋습니다. 자신이 아는 것만 사용하기 보단 그때 그때
상황에 맞게 가장 적합한 동기화 객체를 선택하여 사용하여야 겠지요.