我缩短的、简化的课程如下:
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()。但是这也会释放等待锁的其他线程--这绝对不是我想要的。
有什么想法吗?
向托拜厄斯问好
发布于 2011-10-23 10:19:11
这就是boost::recursive_mutex所允许的,它允许通过同一个线程获得锁,而不需要多次死锁。用它代替boost::mutex
发布于 2011-10-23 10:18:39
在这里你可以做不同的事情。您可以使用可以在同一线程中多次获取的递归互斥对象,也可以将methodA拆分为具有实现的私有方法,没有锁,也可以使用公共方法锁定并调用私有实现。然后,methodB将在保持锁的同时调用内部实现。因为该方法是私有的,所以您可以控制所有的使用,并且可以确保只有在持有锁时才调用实现方法。
发布于 2011-10-23 09:57:49
您可以在tryLock中使用methodA,如果尝试失败,您应该获得当前的threadId,并且只有当线程id与the相同时才继续执行,如果成功,则可以继续正常执行。
https://stackoverflow.com/questions/7865413
复制相似问题