7

我缩短的简化类如下所示:

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(). 但这也会释放等待锁的其他线程——这绝对不是我想要的。

任何的想法?

最好的问候托比亚斯

4

3 回答 3

12

这就是boost::recursive_mutex它允许通过同一线程获得锁而不会多次死锁的原因。用它代替boost::mutex

于 2011-10-23T10:19:11.913 回答
4

您可以在这里做不同的事情。您可以使用可以在同一线程中多次获取的递归互斥锁,或者您可以拆分methodA为具有实现且没有锁的私有方法和锁定然后调用私有实现的公共方法。然后methodB会在持有锁的同时调用内部实现。因为该方法是私有的,所以您可以控制所有使用,并且可以确保仅在持有锁时调用实现方法。

于 2011-10-23T10:18:39.530 回答
0

如果尝试失败,您可以在methodA中使用tryLock,如果线程ID与运行MethodB的threadid相同,您应该获取当前threadId并继续执行。否则如果尝试成功,您可以继续正常执行。

于 2011-10-23T09:57:49.120 回答