我缩短的简化课程如下:
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()
即可。但这也会释放其他线程等待锁定 - 这绝对不是我想要的。
有什么想法吗?
祝你好运 托拜厄斯
答案 0 :(得分:12)
这是boost::recursive_mutex
允许它通过同一个线程获得锁定而没有死锁几次。使用它而不是boost::mutex
答案 1 :(得分:4)
你可以在这里做不同的事情。您可以使用可以在同一个线程中多次获取的递归互斥锁,或者您可以将methodA
拆分为具有实现的私有方法,并且没有锁和公共方法锁定然后调用私有实现。然后methodB
会在持有锁的同时调用内部实现。因为该方法是私有的,所以您可以控制所有用途,并且可以确保仅在持有锁时调用实现方法。
答案 2 :(得分:0)
如果尝试失败,你可以使用方法A中的tryLock,你应该获得当前的threadId,并且只有当线程id与运行MethodB的threadid相同时才继续执行。否则,如果尝试成功,你可以继续正常执行