c++锁定类骨架

c++ Lock class skeleton

本文关键字:锁定 c++      更新时间:2023-10-16

来自有效STL(Scott Meyers著)第12项,下面是c++锁类的骨架。

template<typename Container>
class Lock {
public:
    Lock(const Container& container)
    : c(container)
    {
        getMutexFor(c);
    }
    ~Lock()
    {
        releaseMutexFor(c);
    }
private:
    const Container& c;
};

我不明白的一点是,为什么互斥锁是在锁的c私有成员上获取的(它本身是从我们想要锁定的容器中复制构建的)。

以下内容是否会有效锁定v(以及为什么)?

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

谢谢。

我不明白的一点是,为什么互斥锁是在锁的c私有成员上获取的(它本身是从我们想要锁定的容器中复制构建的)。

c是传递给锁的构造函数的容器的引用,而不是副本。所以同一个集装箱也被锁住了。

以下内容是否会有效锁定v(以及为什么)?

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

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

请注意,只有当访问v的所有其他代码都锁定了相同的互斥体时,例如,通过遵循使用锁保护的相同约定,该锁才有用。

另请参见std::lock_guard

关键是c不是复制构造的,它是一个引用。

实际上是一个引用,传递给构造函数的对象也是如此,正如@juancopanza所说。相对于第二个问题,"以下内容会有效地锁定v(以及为什么)吗?"我认为不会。这是一个例子,Container必须是一个持有互斥对象的特殊类。我们需要查看代码的其余部分。但据我所知,vector并没有内部互斥锁。