来自Effective STL(作者:Scott Meyers)下面的第12项是c ++ Lock类的骨架。
template<typename Container>
class Lock {
public:
Lock(const Container& container)
: c(container)
{
getMutexFor(c);
}
~Lock()
{
releaseMutexFor(c);
}
private:
const Container& c;
};
我不明白的一点是为什么在锁定的私有成员(我们想要锁定的容器上复制构造)上获取互斥锁。
以下是否会有效锁定v(及其原因)?
vector<int> v;
{
Lock<vector<int> > lock(v);
...
}
感谢。
答案 0 :(得分:3)
我不明白为什么在锁的c私有成员(我们想要锁定的容器上复制构造)上获取互斥锁的原因。
c
是传递给锁的构造函数的容器的引用,而不是副本。因此,同一个容器被锁定。
以下是否会有效锁定v(及其原因)?
vector<int> v;
{
Lock<vector<int> > lock(v);
...
}
是的,v
将被锁定在{}
定义的范围内(假设锁定机制已正确实施,当然。)
请注意,只有在访问v
的所有其他代码锁定相同的互斥锁时,此锁定才有用,例如,遵循使用锁定保护的相同约定。
答案 1 :(得分:0)
重点是c
不是复制构造的,而是reference。
答案 2 :(得分:0)
有效地是一个引用,所以传递给构造函数的对象也是如同@juanchopanza所说的那样。相对于第二个问题,“以下是否会有效锁定v(以及为什么)?”我想不是。这是一个示例,Container必须是一个包含互斥锁的特殊类。我们需要看到其余的代码。但是,只要我知道,vector就没有内部互斥锁。