我正在阅读有效的C ++,在Rule 14: Think carefully about copying behavior in resource-managing classes
中,有一个例子:
class Lock {
public:
explicit Lock(Mutex* pm) : mutexPtr(pm) {
lock(mutexPtr);
}
~Lock() {
unlock(mutexPtr);
}
private:
Mutex *mutexPtr;
};
它指出如果我们如上所述构建Lock
,如果我们运行以下代码就会出现问题:
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将解锁两次。那么导致下面问题的真正原因是什么? THX!
答案 0 :(得分:0)
是的,这就是作者说要小心的原因。如果你使用recursive_mutex而不是普通的互斥锁,你可以简单地锁定copy ctor和copy-assign运算符,但如果它是非递归互斥锁,那么使锁类型不可复制可能会更好。