首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scoped_lock范围

scoped_lock范围
EN

Stack Overflow用户
提问于 2014-02-19 07:42:26
回答 2查看 1.4K关注 0票数 2

我有点新的多线程编程。因此,在我的例子中,我有一个boost multi_index容器,可以从多个线程同时到达。我正在执行一些搜索和插入操作。

因此,当搜索以索引开始时,我不希望另一个线程插入一个新值。因为它可以改变指数,把事情放大。所以我得用互斥。

有这么多人为此目的使用boost scoped_lock。我的问题是scoped_lock的“范围”是什么

假设我有这样一个函数:

代码语言:javascript
复制
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 2008环境中使用了visual c++

谢谢..。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-19 10:16:06

代码语言:javascript
复制
boost::mutex::scoped_lock lock(mutex);

创建一个具有自动存储的对象(即一个常规局部变量)。该对象锁定创建时传递的互斥对象,并在破坏时解锁它。由于该对象具有自动存储,因此当它超出作用域时,它会被销毁(因此互斥锁被解锁)。

具体来说,这意味着,如果您将上面的scoped_lock语句放在代码中的******* 1 ********标记处,则互斥锁将一直保持到A()返回为止,因此B的执行也将受到锁的保护(在此上下文中)。

代码语言:javascript
复制
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,用于“资源获取是初始化”,您可以在这里了解更多有关它的信息:What is meant by Resource Acquisition is Initialization (RAII)?

附带注意:从C++11开始,STL现在包括互斥和锁,所以您不需要使用boost。相应的陈述如下:

代码语言:javascript
复制
std::mutex a_mutex;
{
    std::lock_guard<std::mutex> a_lock(a_mutex);

    // mutex is locked until the end of this scope
}
票数 1
EN

Stack Overflow用户

发布于 2014-02-19 08:16:14

作用域锁的作用域在范围内,因此:

代码语言:javascript
复制
X(){

}

Y(){
    boost::mutex::scoped_lock(mut);
    X();
}

这意味着当您调用Y()时,在执行X时也会锁定互斥锁,但只有在从Y调用X时才会锁定互斥锁。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21874083

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档