728x90
안녕하세요 logro 입니다 :)
오늘은 멀티쓰레딩 환경에서 공유 자원을 안전하게 다루는 3가지 도구,
바로
크리티컬 섹션(Critical Section),
뮤텍스(Mutex),
세마포어(Semaphore)에 대해 알아볼게요!
😵 공유 자원, 왜 위험할까요?
여러 쓰레드가 동시에 같은 변수를 바꾸려고 한다면…?
- 데이터가 꼬인다
- 잘못된 결과가 나온다
- 버그가 잡기 힘들어진다 😱
이걸 막기 위해 한 번에 하나의 쓰레드만 자원을 사용하도록 하는 게
바로 동기화의 목적이에요!
🔒 1. 크리티컬 섹션 (Critical Section)
크리티컬 섹션은 공유 자원을 접근하는 코드 영역을 의미해요.
lock (someObject)
{
// 이 안이 바로 크리티컬 섹션!
sharedValue++;
}
- 이 블록은 하나의 쓰레드만 진입 가능
- lock 키워드나 Monitor.Enter/Exit을 사용해서 구현 가능
- 동기화 자체를 의미하는 개념이에요
📌 요약:
"공유 자원에 접근하는 '위험 구간'을 안전하게 보호하자!"
🧱 2. 뮤텍스 (Mutex)
Mutex는 크리티컬 섹션을 보호하는 도구 중 하나예요.
특징은 👉 프로세스 간 동기화도 가능하다는 것!
Mutex mutex = new Mutex();
mutex.WaitOne(); // 잠금
try
{
// 크리티컬 섹션
}
finally
{
mutex.ReleaseMutex(); // 해제
}
- 여러 쓰레드 뿐만 아니라 여러 앱/프로세스 간에도 자원 보호 가능
- 하지만 lock보다 무겁고 느림
📌 요약:
"서로 다른 프로그램끼리도 자원 충돌 막고 싶을 때 사용!"
🚦 3. 세마포어 (Semaphore)
세마포어는 동시에 접근 가능한 쓰레드 수를 제한해주는 도구예요.
Semaphore semaphore = new Semaphore(2, 2); // 동시에 2개까지 허용
semaphore.WaitOne(); // 입장 시도
try
{
// 제한된 리소스를 사용하는 코드
}
finally
{
semaphore.Release(); // 퇴장
}
- 뮤텍스는 1개만 허용, 세마포어는 N개까지 허용
- 예: 동시에 2명만 이용 가능한 프린터, API 제한 등
📌 요약:
"제한된 리소스를 여러 쓰레드가 순서대로 사용하게 하자!"
💡 비교 요약 표
구분 | 허용 개수 | 사용 범위 | 특징 |
크리티컬 섹션 | 1 | 쓰레드 간 (논리적) | lock, Monitor 등으로 구현 |
뮤텍스 | 1 | 쓰레드 + 프로세스 | 무겁지만 강력함 |
세마포어 | N | 쓰레드 + 프로세스 | 제한된 리소스 동시 사용 제어 |
✅ 정리하며
- 크리티컬 섹션은 "이 구역은 한 쓰레드만!"
- 뮤텍스는 "나중에 들어오세요, 지금은 한 명만 가능해요"
- 세마포어는 "최대 N명까지만 입장 가능합니다~"
멀티쓰레딩을 제대로 다루려면
이 세 가지 개념은 꼭 알고 넘어가야 해요 😉
그럼 오늘도 안정적인 코드의 첫걸음을 디뎠으니,
다음에 새로운 개념으로 만나요! 안녕히 계세요 👋
728x90
'운영체제 & 컴퓨터 기초' 카테고리의 다른 글
‘렉(Lag)’은 왜 생기고, 어떻게 해결할 수 있을까? (0) | 2025.04.05 |
---|---|
라운드로빈? 줄 서서 하나씩! 쉬운 CPU 스케줄링 이해하기 🍭 (0) | 2025.04.04 |
사라진 메모리를 따라가는 포인터, 댕글링 포인터란? (0) | 2025.04.04 |
⏳ 느린 작업도 빠르게! C#의 Task, async/await 쉽게 이해하기 (2) | 2025.03.28 |
🧵 멀티태스킹의 시작, Thread란? (0) | 2025.03.28 |