首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >boost::mutex::~mutex():断言`!pthread_mutex_destroy(&m)‘失败

boost::mutex::~mutex():断言`!pthread_mutex_destroy(&m)‘失败
EN

Stack Overflow用户
提问于 2011-10-19 14:01:33
回答 3查看 11.3K关注 0票数 10

我在互斥析构函数中看到标题错误。由于错误可能是由于互斥量在销毁过程中处于锁定状态,所以我创建了一个新的互斥量类,该类继承自boost:mutex。它是为了确保互斥锁在销毁过程中被解锁。但是,仍然会发生相同的错误。任何点击都将不胜感激!

代码语言:javascript
复制
class CMutes : public boost::mutex
{
public:
    CMutes()
    {

    };

    virtual ~CMutes()
    {
        if (m_bLock)
            boost::mutex::unlock();
    };

    void lock()
    {
        if(!m_bLock)
            boost::mutex::lock();
        else
            cout << "Mutex is in lock state\n";
    };

    void unlock()
    {
        if (m_bLock)
            boost::mutex::unlock();
        else
            cout << "Mutex is in unlock state\n";
    }

    boost::mutex& getMutex()
    {
        return *this;
    }

private:

    bool m_bLock;
};

编辑:是的,你是对的。我应该用RAII。然而,我正处于这样的境地。我需要在另一个线程完成对资源的处理之前锁定它。类似于下面的内容。

代码语言:javascript
复制
Thread A:
void getDate()
{
 m_oLock.lock();
 // access resource
}

void unlock()
{
 m_oLock.unlock();
}
Thread B:
void Process()
{
 threadA.getData();
 threadA.unlock();
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-19 14:11:43

不是从boost::mutex继承的,boost::mutex类没有虚拟析构函数,所以它实际上不是用于继承的。

可能的根本原因:

你得到的错误表明你正在一个从未被锁定的互斥锁上调用unlock。类似于:

代码语言:javascript
复制
boost::mutex m;   
m.unlock(); 

通过尝试执行lockunlock,您似乎忘记了在手动执行资源管理时,互斥锁作为locked.This是否经常是问题所在。C++允许使用名为的特定机制来安全防范此类问题。

推荐的解决方案:

您应该使用RAII,而不是显式地解锁互斥锁。您可以使用boost::mutex::scoped_lock来实现RAII:

代码语言:javascript
复制
struct YourStruct
{
    void doSomething()
    {
        boost::mutex::scoped_lock l(m_mutex);
        //do something Interesting
    }
    private: 
        boost::mutex m_mutex;
};
票数 9
EN

Stack Overflow用户

发布于 2012-09-11 14:56:36

我也犯了同样的错误(这就是我如何找到这个问题的)。我通过在相关线程中添加一个join来解决问题。我的主进程在线程之前就结束了,而mutex在解锁之前就被拆掉了。

票数 4
EN

Stack Overflow用户

发布于 2011-10-19 14:12:47

POSIX指出,如果互斥锁以某种方式无效,则从pthread_mutex_destroy操作返回的唯一错误是EINVAL;如果有人正在使用互斥锁(显式地或通过条件变量),则返回EBUSY

最有可能的情况是第二种情况。

但是,我在您的任何代码中都没有看到m_bLock成员变量的任何更改。是否确实不想在lockunlock调用中更改此变量?

如果它正在使用中,您只需等待使用它的人愿意发布它。任何其他选项都不太可能对您有好处:-)

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

https://stackoverflow.com/questions/7817161

复制
相关文章

相似问题

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