뮤텍스와 세마포어를 보며
이 둘에 단수, 복수 차이 말고 어떤 차이가 있을까 궁금해졌다.
뮤텍스와 세마포어에 대한 기본적인 내용은 이전에 다뤘기 때문에
차이점에만 집중해서 알아보겠다.
뮤텍스와 세마포어는 모두 멀티 스레드 혹은 멀티 프로세스 환경에서
공유 자원에 대한 접근을 제어하기 위해 사용된다.
하지만 그 목적과 동작 방식에서는 차이점을 가진다.
뮤텍스는 동시에 하나의 스레드(혹은 프로세스)만
공유자원에 접근하게 끔 제어하여 race condition을 방지한다.
뮤텍스에는 소유자 개념이 있어서,
잠금을 건 스레드만이 잠금을 해제할 수 있다.
이 때문에 뮤텍스는 잘못된 순서로 호출하거나
잠금을 걸고 해제하지 않는 등,
잘못 사용했을 시 데드락 발생 위험이 높다.
세마포어는 뮤텍스와는 살짝 다른 목적을 가진다.
세마포어는 공유자원에 동시에 접근할 수 있는 스레드의 수를 제어하여,
접근의 최대 동시성을 제한하기 위해 사용된다.
또한 이 뿐 아니라 생산자-소비자 문제처럼
여러 스레드 간의 상호 의존적인 작업을 조율하는 데에도 사용될 수 있다.
세마포어는 뮤텍스처럼 단일 스레드만 접근할 수 있게 제한하지 않기 때문에,
race condition을 완전히 방지해주진 못한다.
이를 완전히 방지하려면 뮤텍스와 같은 더 강력한 동기화 장치가 추가로 필요하다.
세마포어는 단지 "race condition 방지에 도움을 줄 수 있음" 정도이다.
세마포어에는 소유자 개념이 없기 때문에,
wait를 호출한 스레드가 아니더라도 signal을 호출할 수 있다.
이로 인해 세마포어는 뮤텍스에 비해 데드락 발생 가능성이 낮다.