我有点新的多线程编程。因此,在我的例子中,我有一个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 2008环境中使用了visual c++
谢谢..。
发布于 2014-02-19 10:16:06
boost::mutex::scoped_lock lock(mutex);创建一个具有自动存储的对象(即一个常规局部变量)。该对象锁定创建时传递的互斥对象,并在破坏时解锁它。由于该对象具有自动存储,因此当它超出作用域时,它会被销毁(因此互斥锁被解锁)。
具体来说,这意味着是,如果您将上面的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,用于“资源获取是初始化”,您可以在这里了解更多有关它的信息:What is meant by 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
}发布于 2014-02-19 08:16:14
作用域锁的作用域在范围内,因此:
X(){
}
Y(){
boost::mutex::scoped_lock(mut);
X();
}这意味着当您调用Y()时,在执行X时也会锁定互斥锁,但只有在从Y调用X时才会锁定互斥锁。
https://stackoverflow.com/questions/21874083
复制相似问题