c ++ Lock类骨架

时间:2015-04-07 21:43:47

标签: c++ stl

来自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);
    ...
}

感谢。

3 个答案:

答案 0 :(得分:3)

  

我不明白为什么在锁的c私有成员(我们想要锁定的容器上复制构造)上获取互斥锁的原因。

c是传递给锁的构造函数的容器的引用,而不是副本。因此,同一个容器被锁定。

  

以下是否会有效锁定v(及其原因)?

vector<int> v;
{
    Lock<vector<int> > lock(v);
    ...
}

是的,v将被锁定在{}定义的范围内(假设锁定机制已正确实施,当然。)

请注意,只有在访问v的所有其他代码锁定相同的互斥锁时,此锁定才有用,例如,遵循使用锁定保护的相同约定。

另见std::lock_guard

答案 1 :(得分:0)

重点是c不是复制构造的,而是reference

答案 2 :(得分:0)

有效地是一个引用,所以传递给构造函数的对象也是如同@juanchopanza所说的那样。相对于第二个问题,“以下是否会有效锁定v(以及为什么)?”我想不是。这是一个示例,Container必须是一个包含互斥锁的特殊类。我们需要看到其余的代码。但是,只要我知道,vector就没有内部互斥锁。