데드락은 자원 대기 그래프의 순환이다

두 스레드가 서로가 가진 mutex를 기다리면 아무도 진행하지 못한다. 핵심은 “누가 무엇을 들고 무엇을 기다리는가”를 순환으로 보는 것이다.

발생 구조

Thread A m1 보유, m2 요청
mutex m2 Thread B가 이미 보유
Thread B m2 보유, m1 요청
mutex m1 Thread A가 이미 보유
Thread A -> m2 -> Thread B -> m1 -> Thread A 순환이 생기면 진행 불가 상태가 된다.

판단 체크

  • 상호 배제mutex는 한 번에 한 스레드만 보유한다.
  • 점유 대기락을 든 상태로 다른 락을 기다린다.
  • 비선점다른 스레드의 mutex를 강제로 빼앗을 수 없다.
  • 순환 대기대기 그래프에 닫힌 고리가 생긴다.
순서 고정모든 코드가 m1 -> m2 순서로 잠근다.
RAII 묶음std::scoped_lock(m1, m2)로 함께 관리한다.
락 범위 축소공유 데이터 접근만 잠그고 오래 걸리는 작업은 밖으로 뺀다.