윈도우 환경에서 semaphore와 mutex의 차이점


가장 대표적인 동기화 객체가 semaphore와 mutex인데도 불구하고, 윈도우즈 프로그래머에게는 낯선 경우가 많다(내 주변에만 그럴지도). 윈도우즈 환경에서는 저 둘에 비해 사기에 가까운 성능을 보이는 critical section을 더 많이 사용하기 때문에 실제로 쓸 기회가 별로 없는 것도 사실이다. 이렇듯 낯선 semphore와 mutex에 차이점에 대해서 알아보자.

둘은 비슷한 점이 많아서 mutex는 최대값이 1인 semaphore라고 설명하기도 한다. 실제로 최대값이 1인 semaphore는 mutex의 행동을 거의 100% 가깝게 흉내낼 수 있다. 둘다 프로세스 사이나 쓰레드 간에 모두 사용이 가능하다. 이름만 있으면 다른 프로세스에서도 확실히 사용이 가능하다(OpenSemaphoreOpenMutex).

둘의 가장 큰 차이는 mutex에 소유 쓰레드라는 개념이 존재한다는 것이다. Mutex의 소유권을 획득(WaitForSingleObject)하면 그 mutex는 해당 쓰레드에서만 접근 가능한 상태로 변한다. 그래서 다른 쓰레드에서는 ReleaseMutex를 신나게 호출해봐야 원하는 결과를 얻을 수 없다.

Critical section이나 semaphore같은 경우에는 다른 쓰레드에서 락의 해제가 가능해 관리자를 만들어 중간에 락을 해제할 수 있지만 mutex는 잘못 걸리면 그냥 죽어야된다. 그런 문제가 있다면 semaphore만 쓰면되지 왜 mutex같은 걸 만들었나요?라고 묻는다면 간단한게 언제나 좋다라고 대답할 수밖에 없다. 대부분의 경우에 mutex가 훨씬 더 단순하니까.

언제나 그렇지만 상황에 맞는 걸 찾아서 쓰는건 본인의 몫이다.
TRACKBACK 0 COMMENT 1
prev 1 ... 36 37 38 39 40 41 42 43 44 ... 100 next