繁体   English   中英

“嵌套”scoped_lock

[英]“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM