c++锁定类骨架
c++ Lock class skeleton
来自有效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并没有内部互斥锁。
相关文章:
- 如何找到锁定Linux futex的C++行
- G锁定铸造到基础上会释放模拟行为
- 如何检查线程是否锁定
- 如何在C++中找到active directory中禁用和锁定的窗口帐户
- 我应该在锁定TBitmap画布后解锁它吗
- C++ 11 中的锁定是否保证访问数据的新鲜度?
- 在两个线程上读/写 64 位,无互斥/锁定/原子
- 如何在实时应用程序中锁定线程
- 在 lambda 中锁定 std::shared_ptr 的复制操作
- 使用简单两相锁定的并发程序
- 锁定来自其他线程的类成员
- 他们如何将红外锁定像素转换为镜头前方 1m 的正常平面上的位置
- 同一互斥锁顺序上的锁定和解锁是否一致?
- 共享内存的升压容器是否实现锁定?
- 当只有一个线程主要使用该对象而其他线程很少使用它时,如何最小化该对象的互斥锁锁定?
- 如何在 x86 处理器上实现"锁定添加"
- MCS 锁定实现的问题
- Sqlite3 C++数据库被锁定
- 如果互斥锁被锁定,则安全地跳过任务
- 错误:"shared_mutex"不是使用读取器锁定 = std::shared_lock<std::shared_mutex> 的"std"的成员;