[英]Scope of scoped_lock
我对多线程编程有点陌生。 因此,在我的情况下,我有一个boost multi_index
容器,可以同时从多个线程访问。 我正在执行一些搜索和插入操作。
因此,当搜索以索引开始时,我不希望另一个线程插入新值。 因为它可以改变索引和质量。 所以我必须使用互斥锁。
很多人为此目的使用boost scoped_lock
。 我的问题只是scoped_lock
的“范围”是什么?
假设我有一个像这样的 function :
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
在我的情况下有很大的不同,或者 go 可以使用scoped_lock
吗?
注意:我在visual sturdio 2008环境中使用visual c++
谢谢...
范围锁的 scope 在 scope 之内,所以:
X(){
}
Y(){
boost::mutex::scoped_lock(mut);
X();
}
意味着当您调用Y()
时,互斥锁也将在X
执行期间被锁定,但仅当从Y
调用X
时。
boost::mutex::scoped_lock lock(mutex);
创建具有自动存储功能的 object(也称为常规局部变量)。 这个 object 在创建时锁定您传递给它的互斥锁,并在销毁时解锁它。 由于 object 具有自动存储功能,因此当它超出 scope 时,它会被销毁(因此互斥锁被解锁)。
具体来说,这意味着是的,如果您将上面的 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,意思是“Resource Acquisition Is Initialization”,您可以在这里了解更多信息: Resource Acquisition is Initialization (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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.