Scope of scoped_lock

Scope of scoped_lock

本文关键字:lock scoped of Scope      更新时间:2023-10-16

我对多线程编程有点陌生。因此,在我的情况下,我有一个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 Bprocedure search中的进程吗?还是我也必须把锁放在Bsearch中?(至标有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时。