Scope of scoped_lock
Scope of scoped_lock
我对多线程编程有点陌生。因此,在我的情况下,我有一个boost multi_index
容器,它可以从多个线程同时访问。我正在执行一些搜索和插入操作。
因此,当搜索以索引开始时,我不希望另一个线程插入新值。因为它可以改变索引,把东西堆起来。所以我必须使用互斥锁。
很多人使用boost scoped_lock
来达到这个目的。我的问题很简单,scoped_lock
的"范围"是什么?
假设我有一个类似的函数:
void A ()
{
myData data;
// prepare data here
// ******* 1 ********
B(data); // assume this perform some operations
}
void B (myData data)
{
// do some stuff with data
// ******* 2 ********
search(data);
}
void search(myData data)
{
// ******* 3 ********
// start searching the data here
}
所以我想从进程的开始就获得锁,这意味着从过程A开始。如果我把我的boost::mutex::scoped_locklock(mutex);
代码放在标记为******* 1 ********
的地方,它会同时锁定procedure B
和procedure search
中的进程吗?还是我也必须把锁放在B
和search
中?(至标有2和3的地方)。哪一个是正确的位置1、2、3还是全部?
顺便说一句,我的应用程序是单身作家&多读卡器类型。所以shared_lock
在我的情况下有很大的不同,还是可以使用scoped_lock
?
注意:我在visual sturdio 2008环境中使用visual c++
谢谢。。。
boost::mutex::scoped_lock lock(mutex);
创建一个具有自动存储的对象(也称为常规局部变量)。这个对象在创建时锁定您传递给它的互斥对象,在销毁时解锁它。由于对象具有自动存储,所以当它超出作用域时,它会被销毁(因此互斥锁也会被解锁)。
具体地说,这意味着yes,如果您将上面的scoped_lock语句放在代码中的******* 1 ********
标记处,则互斥锁将一直保持到A()
返回,因此B的执行也将受到锁的保护(在此上下文中)。
void A ()
{
myData data;
// prepare data here
boost::mutex::scoped_lock lock(mutex);
// whatever happens from here ....
doSomeStuff();
B(data); // assume this perform some operations
doMoreStuff();
// ... to here is protected by the lock
}
这个编程习惯用法被命名为RAII,意思是"资源获取就是初始化",您可以在这里了解更多信息:资源获取是初始化(RAII)的意思是什么?
附带说明:从C++11开始,STL现在包括互斥和锁,因此不需要为此使用boost。等效语句为:
std::mutex a_mutex;
{
std::lock_guard<std::mutex> a_lock(a_mutex);
// mutex is locked until the end of this scope
}
作用域锁的作用域在作用域内,所以:
X(){
}
Y(){
boost::mutex::scoped_lock(mut);
X();
}
意味着当您调用Y()
时,互斥体也将在执行X
时被锁定,但仅当从Y
调用X
时。
- 尝试构建"lock-free"数据结构C++
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 为什么"weak.lock()"返回"nullptr" "auto weak=std::make_shared<int>(42);"的定义?
- DRD 报告"conflicting load" std::mutex::lock 上的错误
- 在 std::tie 中使用 std::weak_ptr::lock()
- std::lock_guard 怎么可能比 std::mutex::lock() 更快?
- std::mutex::lock() 产生奇怪(和不必要的)ASM 代码
- "lock cmpxchg"如何在装配中工作?
- std::lock 仍然导致死锁
- 在任何地方对C++中所有并行线程中的所有锁定和解锁实例使用相同的 std::mutex 和 lock 对象
- 我们是否需要对多线程 x32 系统使用 lock 来读取或写入 uint32_t 变量
- 使用Mutex,lock_guard,在课堂中正确地lock
- 当我调用lock()时,为什么std :: mutex会引发异常
- mutex.lock vs unique_lock
- 使用 std::lock (c++11) 的大量 CPU 负载
- 我是否必须使用neak_ptr.lock()只是为了测试它是否指向有效的对象
- std::lock() equivalent for boost::shared_mutex?
- mutex::lock() 检查一次解锁状态是否已经被另一个线程锁定?
- 为什么在 std::lock 中没有超时支持
- 为什么在使用qt等待条件时不必包装lock/unlock语句