“嵌套”scoped_lock

时间:2011-10-23 09:47:37

标签: c++ scoped-lock boost-mutex

我缩短的简化课程如下:

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

有什么想法吗?

祝你好运 托拜厄斯

3 个答案:

答案 0 :(得分:12)

这是boost::recursive_mutex允许它通过同一个线程获得锁定而没有死锁几次。使用它而不是boost::mutex

答案 1 :(得分:4)

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

答案 2 :(得分:0)

如果尝试失败,你可以使用方法A中的tryLock,你应该获得当前的threadId,并且只有当线程id与运行MethodB的threadid相同时才继续执行。否则,如果尝试成功,你可以继续正常执行