首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >“嵌套”scoped_lock

“嵌套”scoped_lock
EN

Stack Overflow用户
提问于 2011-10-23 09:47:36
回答 3查看 2.5K关注 0票数 7

我缩短的、简化的课程如下:

代码语言:javascript
复制
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()。但是这也会释放等待锁的其他线程--这绝对不是我想要的。

有什么想法吗?

向托拜厄斯问好

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-23 10:19:11

这就是boost::recursive_mutex所允许的,它允许通过同一个线程获得锁,而不需要多次死锁。用它代替boost::mutex

票数 12
EN

Stack Overflow用户

发布于 2011-10-23 10:18:39

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

票数 4
EN

Stack Overflow用户

发布于 2011-10-23 09:57:49

您可以在tryLock中使用methodA,如果尝试失败,您应该获得当前的threadId,并且只有当线程id与the相同时才继续执行,如果成功,则可以继续正常执行。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7865413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档