둠치킨
코딩하는 둠치킨
둠치킨

블로그 메뉴

  • 홈
  • 분류 전체보기 (201)
    • BOJ (159)
      • 스택 (14)
      • 큐 (5)
      • 덱 (4)
      • 그래프 (30)
      • 배열 (8)
      • 재귀 (12)
      • 브루트 포스 (2)
      • 그리디 알고리즘 (7)
      • 다이내믹 프로그래밍 (6)
      • 백트래킹 (24)
      • 기하학 (4)
      • 트리 (4)
      • 구현 (14)
      • 수학 (3)
      • 맵 (1)
      • 다익스트라 (2)
    • 자료구조 (14)
      • 스택 (3)
      • 큐 (5)
      • 덱 (2)
      • 그래프 (1)
      • 트리 (1)
      • 힙 (1)
      • 정렬 (1)
    • C++ (6)
      • 모두의코드 (2)
      • Effective C++ (3)
      • C++ STL (1)
    • 컴파일러 (1)
    • OS (17)
    • 컴퓨터 구조 (2)
    • Unreal Engine 5 (2)

공지사항

전체 방문자
오늘
어제

인기 글

최근 글

태그

  • BFS
  • boj
  • Bruteforce
  • C
  • C++
  • C++ STL
  • Cache Memory
  • deadlock
  • DFS
  • Effective C++
  • java
  • Mutex
  • next_permutation
  • os
  • Process
  • rotate
  • semaphore
  • spin lock
  • STL
  • Thread
hELLO · Designed By 정상우.
둠치킨

코딩하는 둠치킨

OS

뮤텍스(Mutex)

2025. 6. 24. 20:37

뮤텍스 (Mutex)란?

뮤텍스(Mutex, Mutual Exclusion)는 하나의 공유 자원에 여러 스레드가 동시에 접근하는 것을 방지하기 위한 동기화 기법이다.
멀티스레드 환경에서 발생할 수 있는 경쟁 조건(Race Condition)을 방지하고, 임계영역(Critical Section)을 안전하게 보호하는 데 사용된다.


주요 특징

  • 단일 자원 보호에 특화된 락
  • 소유 개념 존재: 락을 획득한 스레드만 해제할 수 있다
  • 임계영역 보호: 동시 접근을 차단하여 데이터 일관성 유지
  • 커널 기반 동기화 도구: 필요 시 사용자 모드 → 커널 모드 전환 (문맥 교환 발생 가능)

동작 방식

뮤텍스는 기본적으로 다음의 구조로 작동한다.

  1. 스레드가 공유 자원을 사용하기 전 lock을 시도
  2. 다른 스레드가 이미 뮤텍스를 소유하고 있다면 블로킹 상태로 대기
  3. 자원을 사용한 후 unlock을 호출해 다른 스레드에게 뮤텍스를 넘김

이 과정을 통해 자원 접근은 한 번에 하나의 스레드만 허용되며, 경쟁 조건을 방지할 수 있다.


예제 코드 (POSIX pthread 기반)

#include <iostream>
#include <pthread.h>

int counter = 0;
pthread_mutex_t lock;

void* increment(void* arg) {
    for (int i = 0; i < 100000; ++i) {
        pthread_mutex_lock(&lock);   // 임계영역 진입
        counter++;
        pthread_mutex_unlock(&lock); // 임계영역 탈출
    }
    return nullptr;
}

int main() {
    pthread_t t1, t2;
    pthread_mutex_init(&lock, nullptr); // 뮤텍스 초기화

    pthread_create(&t1, nullptr, increment, nullptr);
    pthread_create(&t2, nullptr, increment, nullptr);

    pthread_join(t1, nullptr);
    pthread_join(t2, nullptr);

    pthread_mutex_destroy(&lock); // 뮤텍스 해제

    std::cout << "Final counter: " << counter << std::endl;
    return 0;
}

단점 및 주의사항

  • 문맥 교환 발생: 뮤텍스는 블로킹 기반으로, 대기 중인 스레드는 CPU를 반납하고 재스케줄링 필요 → 성능 저하
  • 데드락 위험: 여러 락을 중첩 사용할 경우 순서에 따라 교착 상태가 발생할 수 있음
  • 락 경합: 많은 스레드가 동일한 자원에 접근하려 할 때 성능 저하
  • 오버헤드: 빈번한 락/언락은 성능에 영향을 줄 수 있음
저작자표시 (새창열림)

'OS' 카테고리의 다른 글

스핀락(Spin Lock)  (0) 2025.06.24
세마포어(Semaphore)  (0) 2025.06.24
멀티쓰레드 환경에서 생길 수 있는 문제들  (0) 2025.06.24
다양한 OS 스케줄링 기법  (0) 2025.06.24
쓰레드와 프로세스 (Thread & Process)  (0) 2025.06.24
    'OS' 카테고리의 다른 글
    • 스핀락(Spin Lock)
    • 세마포어(Semaphore)
    • 멀티쓰레드 환경에서 생길 수 있는 문제들
    • 다양한 OS 스케줄링 기법
    둠치킨
    둠치킨
    코딩 공부를 위한 코딩 블로그 기록 일기

    티스토리툴바