繁体   English   中英

scoped_lock 的 Scope

[英]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 Bprocedure 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM