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

Mic*_*l D 8 c++ boost mutex

我在互斥析构函数中得到了标题错误.由于错误可能是由于互斥锁在破坏期间处于锁定状态,因此我创建了一个新的互斥类,它继承自boost:mutex.这是为了确保在销毁期间互斥锁被解锁.但是,仍然会出现相同的错误.任何点击将不胜感激!

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;
};
Run Code Online (Sandbox Code Playgroud)

编辑:是的你是对的.我应该使用RAII.但是,我处于这种情况.我需要在另一个线程完成处理之前锁定资源.类似下面的东西.

Thread A:
void getDate()
{
 m_oLock.lock();
 // access resource
}

void unlock()
{
 m_oLock.unlock();
}
Thread B:
void Process()
{
 threadA.getData();
 threadA.unlock();
}
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 8

继承boost::mutex,boost::mutex该类没有虚拟析构函数,因此它实际上并不适用于继承.

可能的根本原因:
您收到的错误表示您正在调用unlock从未锁定的互斥锁.就像是:

boost::mutex m;   
m.unlock(); 
Run Code Online (Sandbox Code Playgroud)

通过努力做lockunlock,看来你失去的互斥体locked.This是很经常的问题,当你手动执行资源管理的轨道.C++允许称为资源分配的特定机制是启动(RAII),以便安全地防范此类问题.

Suggestted解决方案:
您应该使用RAII,而不是明确解锁互斥锁.您可以使用boost :: mutex :: scoped_lock来实现RAII:

struct YourStruct
{
    void doSomething()
    {
        boost::mutex::scoped_lock l(m_mutex);
        //do something Interesting
    }
    private: 
        boost::mutex m_mutex;
};
Run Code Online (Sandbox Code Playgroud)

  • 对不起.从核心来看,它表明它在互斥体的析构函数中失败了.是的.这只是一个证明互斥锁处于解锁状态的测试.来自/lib64/libc.so.6(gdb)的raise()中的#0 0x0000003803030265其中#l 0x0000003803030265 in raise()来自/lib64/libc.so.6#1 0x0000003803031d10 in abort()来自/lib64/libc.so来自/lib64/libc.so.6的__assert_fail()中的.6#2 0x00000038030296e6#boost :: mutex ::〜mutex()中的#3 0x0000000000416314 (2认同)