lock을 잡는다는 것은 비유하면 자물쇠가 있는 문을 이용하는 것과 같다
하지만 자물쇠가 2개 있고 사용자가 각 자물쇠를 가지고 다른 자물쇠를 얻기를 기다린다면 영원히 문을 열 수 없다.
이와 같은 상황을 dead lock이라고 한다.
dead lock이 일어나는 이유는 잡은 lock을 풀지 않아서인 경우도 있는데 이는 발생하면 안되는 프로그래머 실수이다.
다른 이유는 lock을 잡는 순서가 일관되지 않은 경우이다.
lock잡는 순서를 일관되게 하기 위해 wrapper mutex를 만들고 id를 둬, id가 큰 mutex가 먼저 lock을 획득해야 한다든가 하는 규칙을 만들고 이를 사용하는 것이다.
참고로 std::lock을 이용하여 lock순서를 일관되게 할 수 있다.
// 참고
mutex m1;
mutex m2;
std::lock(m1, m2); // 일련의 규칙으로 순서대로 lock을 보장
// adopt_lock : 이미 lock상태이니까, 나중에 소멸될 때 풀어주기만 해
lock_guard<mutex> g1(m1, std::adopt_lock);
lock_guard<mutex> g2(m2, std::adopt_lock);
그래프 알고리즘을 이용해 dead lock 탐지하는 기능을 만들어 사용할 수도 있다.
이처럼 lock간 순환구조가 발생하면 dead lock이 발생하기 쉽다.
참조 : [C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버 - 인프런 | 강의 (inflearn.com)
댓글 영역