05_deadlock

05_deadlock

날짜
생성자
ShalomShalom
카테고리
pararell
작성일
2023년 05월 15일
태그
c++
이전 블로그
A와 B, 2개의 클래스가 있고 각각 뮤텍스를 static 멤버로 가지고 있다.
static A::something은 자신의 mutex를 lock하고 무언가를 진행한다.
static B::something은 자신의 mutex를 lock하고 무언가를 진행한다.
static A::something은 B의 뮤텍스를 lock 해야한다.

코드

void A::something() { lock_guard<mutex> guard(a_mutex); lock_guard<mutex> guard(B::mutex); }
static B::something은 A의 뮤텍스를 lock 해야한다.
void B::something() { lock_guard<mutex> guard(b_mutex); lock_guard<mutex> guard(A::a_mutex); }
두개의 something()은 다른 스레드에 할당 되었을 경우
A는 자신의 lock을 걸은 상황과, B또한 자신의 lock을 걸은 상황이라면 서로의 lock을 풀어줘야 다음 라인으로 진행할 수 있다.

방지법

Lock의 순서를 지정한다.
void A::something() { lock_guard<mutex> guard(a_mutex); lock_guard<mutex> guard(B::mutex); }
void B::something() { lock_guard<mutex> guard(A::a_mutex); // A가 먼저 lock_guard<mutex> guard(b_mutex); }

댓글

guest