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); }
댓글