# 세마포어와 뮤텍스, 언제 무엇을 쓰나

- 게시: 2026.07.13
- 원문(HTML): https://trendbrief.news/articles/%EC%84%B8%EB%A7%88%ED%8F%AC%EC%96%B4%EC%99%80-%EB%AE%A4%ED%85%8D%EC%8A%A4-%EC%96%B8%EC%A0%9C-%EB%AC%B4%EC%97%87%EC%9D%84-%EC%93%B0%EB%82%98.html
- 발행: [트렌드브리프](https://trendbrief.news/)

> 뮤텍스는 하나의 스레드만 자원에 접근하도록 잠그는 도구이고, 세마포어는 정해진 수만큼 동시 접근을 허용하는 신호 장치다. 두 도구의 차이와 실무에서 고르는 기준을 정리했다.

뮤텍스(mutex, 상호 배제 잠금)는 한 번에 스레드 하나만 공유 자원에 들어가도록 문을 잠그는 도구다. 세마포어(semaphore, 신호기)는 정해진 개수만큼 동시 접근을 허용하며 남은 자리를 세는 카운터다. 둘 다 여러 작업이 같은 자원을 동시에 건드려 생기는 충돌을 막지만, 뮤텍스는 한 명만 들이고 세마포어는 정해진 수만큼 들인다는 점이 다르다. 이 글은 운영체제 교과서에서 통상 설명되는 정의를 기준으로, 멀티스레드 환경에서 두 도구의 차이와 선택 기준을 다룬다. 특정 언어의 세부 API 문법은 다루지 않는다.

## 왜 잠금 장치가 필요한가

여러 스레드가 같은 변수나 파일을 동시에 고치면 결과가 실행 순서에 따라 달라진다. 이렇게 순서에 따라 값이 어긋나는 상황을 경쟁 상태(race condition)라고 부른다. 예를 들어 잔액이 만 원인 계좌에서 두 스레드가 동시에 잔액을 읽어 각각 오천 원을 더하면, 마지막에 쓴 값만 남아 한쪽 입금이 사라질 수 있다.

이처럼 한 번에 하나의 스레드만 실행해야 하는 코드 구간을 임계 구역(critical section)이라고 한다. 뮤텍스와 세마포어는 바로 이 임계 구역을 지키는 대표적인 장치다. 둘 다 지금 들어가도 되는지를 확인하고 자리를 잡는 방식으로 충돌을 막지만, 허용하는 인원 수와 쓰임새가 갈린다.

## 뮤텍스는 어떻게 동작하나

뮤텍스는 잠금을 얻은 스레드 하나만 임계 구역에 들여보내고, 그 스레드가 나올 때 잠금을 푼다. 다른 스레드는 잠금이 풀릴 때까지 문 앞에서 기다린다. 이름 그대로 상호 배제(mutual exclusion), 곧 동시에 못 들어감을 강제하는 도구다.

뮤텍스의 중요한 성질로 소유권이 자주 언급된다. 잠금을 건 스레드만 그 잠금을 풀 수 있다는 규칙으로, 많은 구현에서 이렇게 안내된다. 덕분에 지금 누가 이 자원을 쥐고 있는지가 분명해지고, 엉뚱한 스레드가 남의 잠금을 푸는 실수를 막기 쉽다.

- 보호 대상: 한 번에 한 스레드만 써야 하는 자원 하나

- 기본 동작: 잠금(lock) 뒤 작업, 끝나면 해제(unlock)

- 주의: 해제를 빠뜨리면 다른 스레드가 영영 기다린다

## 세마포어는 무엇이 다른가

세마포어는 동시에 몇 개까지 들여보낼지를 숫자로 관리하는 신호 장치다. 안에 든 카운터가 남은 자리 수를 뜻해서, 스레드가 들어갈 때 하나 줄고 나올 때 하나 는다. 카운터가 0이면 자리가 빌 때까지 기다린다.

허용 인원이 1인 세마포어를 이진 세마포어(binary semaphore)라고 하며, 겉보기 동작은 뮤텍스와 비슷하다. 다만 세마포어는 소유권 개념 없이 신호를 세는 데 초점이 있어, 한 스레드가 신호를 보내고 다른 스레드가 그 신호를 받아 깨어나는 식의 순서 맞추기에도 쓴다. 작업을 만들어 넣는 스레드와 꺼내 쓰는 스레드 사이에서 물건이 하나 들어왔음을 알리는 용도가 대표적이다. 세마포어 개념은 컴퓨터 과학자 에츠허르 데이크스트라가 제안한 것으로 알려져 있다.

- 계수 세마포어: 커넥션 풀처럼 동시 사용 개수를 제한할 때

- 이진 세마포어: 잠금 대신 스레드 사이 신호를 주고받을 때

- 카운터 값: 남은 허용 개수를 그대로 나타냄

## 언제 뮤텍스를 쓰고 언제 세마포어를 쓰나

자원 하나를 한 번에 한 스레드만 쓰도록 보호하는 게 목적이면 뮤텍스가 맞다. 반대로 동시 접근 수를 정해진 만큼 열어 주거나, 스레드끼리 준비됐다 같은 신호를 주고받아야 하면 세마포어가 어울린다. 판단이 헷갈릴 때는 몇 명을 들여보내고 싶은지와 잠그는 쪽과 푸는 쪽이 같은지를 먼저 따져 보면 방향이 잡힌다.

- 한 자원 보호, 잠근 스레드가 직접 해제: 뮤텍스

- 동시 접근 수 제한(예: 다운로드 3개까지): 계수 세마포어

- 생산자와 소비자 사이 신호 전달: 세마포어

## 실무에서 자주 밟는 함정

둘 중 무엇을 쓰든 잠금을 다루는 코드에는 비슷한 위험이 따른다. 대표적인 것이 교착 상태(deadlock)로, 두 스레드가 서로가 쥔 잠금을 기다리며 둘 다 멈춰 버리는 상황이다. 여러 잠금을 쓸 때 항상 같은 순서로 잠그면 이 위험이 줄어든다고 널리 안내된다.

- 해제 누락: 예외가 나도 잠금이 풀리도록 코드를 감싼다

- 범위 최소화: 임계 구역은 꼭 필요한 줄만 짧게 잡는다

- 잠금 순서 고정: 여러 잠금은 정해진 순서로만 획득한다

정리하면 뮤텍스는 한 명만을 강제하는 잠금, 세마포어는 정해진 수를 관리하고 신호를 주고받는 카운터다. 보호할 자원이 하나이고 잠근 쪽이 직접 풀어야 하면 뮤텍스, 동시 허용 개수를 다루거나 스레드 사이 신호가 필요하면 세마포어를 먼저 떠올리면 대부분 맞아떨어진다.

## 관련 글

- [서버리스 아키텍처가 무엇이고 언제 유용한가](https://trendbrief.news/articles/%EC%84%9C%EB%B2%84%EB%A6%AC%EC%8A%A4-%EC%95%84%ED%82%A4%ED%85%8D%EC%B2%98%EA%B0%80-%EB%AC%B4%EC%97%87%EC%9D%B4%EA%B3%A0-%EC%96%B8%EC%A0%9C-%EC%9C%A0%EC%9A%A9%ED%95%9C%EA%B0%80.md)
- [Skillify AI, 무엇을 하고 누구에게 맞는 도구인가](https://trendbrief.news/articles/skillify-ai-%EB%AC%B4%EC%97%87%EC%9D%84-%ED%95%98%EA%B3%A0-%EB%88%84%EA%B5%AC%EC%97%90%EA%B2%8C-%EB%A7%9E%EB%8A%94-%EB%8F%84%EA%B5%AC%EC%9D%B8%EA%B0%80.md)
- [graphify 후기, 무엇을 확인하고 골라야 할까](https://trendbrief.news/articles/graphify-%ED%9B%84%EA%B8%B0-%EB%AC%B4%EC%97%87%EC%9D%84-%ED%99%95%EC%9D%B8%ED%95%98%EA%B3%A0-%EA%B3%A8%EB%9D%BC%EC%95%BC-%ED%95%A0%EA%B9%8C.md)
- [GPT-5·6 도입 전 개발자가 점검할 것들](https://trendbrief.news/articles/gpt-5-6-%EB%8F%84%EC%9E%85-%EC%A0%84-%EA%B0%9C%EB%B0%9C%EC%9E%90%EA%B0%80-%EC%A0%90%EA%B2%80%ED%95%A0-%EA%B2%83%EB%93%A4.md)
- [깃허브 코파일럿 가격, 플랜 구성과 선택 기준](https://trendbrief.news/articles/%EA%B9%83%ED%97%88%EB%B8%8C-%EC%BD%94%ED%8C%8C%EC%9D%BC%EB%9F%BF-%EA%B0%80%EA%B2%A9-%ED%94%8C%EB%9E%9C-%EA%B5%AC%EC%84%B1%EA%B3%BC-%EC%84%A0%ED%83%9D-%EA%B8%B0%EC%A4%80.md)