[英]“Nested” scoped_lock
我缩短的简化课程如下:
class A
{
public:
// ...
methodA();
methodB();
protected:
mutable boost::mutex m_mutex;
sometype* m_myVar;
}
A::methodA( int someParam )
{
boost::mutex::scoped_lock myLock(m_mutex);
m_myVar->doSomethingElse();
}
A::methodB( int someParam )
{
boost::mutex::scoped_lock myLock(m_mutex);
m_myVar->doSomething();
this->methodA(someParam);
}
我想在m_myVar
上同步访问。 当调用A::methodB()
线程运行与相同的互斥锁两次,显然是在第一线块A::methodA()
有没有办法让scoped_lock
在再次传递时不会阻塞同一个线程 ?
当然,我只需要调用m_mutex.unlock()
。 但这也会释放其他线程等待锁定 - 这绝对不是我想要的。
任何的想法?
最好的问候托比亚斯
这就是boost::recursive_mutex
允许它通过同一个线程获得锁定而没有多次死锁。 使用它而不是boost::mutex
你可以在这里做不同的事情。 您可以使用可以在同一个线程中多次获取的递归互斥锁,或者您可以将methodA
拆分为具有实现的私有方法,并且没有锁定以及锁定然后调用私有实现的公共方法。 然后methodB
会在持有锁的同时调用内部实现。 因为该方法是私有的,所以您可以控制所有用途,并且可以确保仅在持有锁时调用实现方法。
您可以在方法A中使用tryLock,如果尝试失败,您应该获取当前threadId,并且仅当线程id与运行MethodB的threadid相同时继续执行。否则,如果尝试成功,您可以继续正常执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.