2017-12-11 6 views
0
Rule 14: Think carefully about copying behavior in resource-managing classes에, 예를 들어 내가 효과적인 C++을 읽고있다가

아래 코드 :복사 RAII 객체는

Mutex m; 
Lock ml1(&m); 
Lock ml2(ml1); 

나는 그것을 할 수있다 생각하기 때문에 다음과 같은 코드는 수도 실행 :

// ml1 constructes 
lock(m) 
// copy ml2, but ml1.mutexPtr and ml2.mutexPtr both point to m 
ml2.mutexPtr = ml1.mutexPtr 
// ml1 destructs 
unlock(m) 
// ml2 destructs 
unlock(m) 

그러면 m이 두 번 잠금 해제됩니다. 아래의 원인으로 인해 실제 원인이 무엇입니까? 고마워!

+0

이 책의 버전은 무엇입니까? 내 버전의 "항목 14"는 가상 소멸자에 관한 것입니다 ... –

+0

효과적인 C++ : 프로그램 및 디자인 개선을위한 55 가지 구체적인 방법 [버전 3] – Caesium

+0

아, 버전 2가 있습니다. 죄송합니다. –

답변

0

예, 그렇기 때문에 저자는주의해야한다고 말합니다. 평범한 뮤텍스 대신에 recursive_mutex를 사용한다면 단순히 ctor와 copy-assign 연산자를 잠글 수 있지만 재귀 적 뮤텍스가 아닌 경우 잠금 유형을 카피 불가능으로 만드는 것이 더 나을 것입니다.