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

boost::mutex::~mutex(): Assertion `!pthread_mutex_destroy(&m)' failed

本文关键字:mutex destroy 失败 boost 断言 pthread      更新时间:2023-10-16

我在互斥析构函数中得到了标题错误。由于错误可能是由于互斥锁在销毁期间处于锁定状态,我创建了一个新的互斥锁类,它继承自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 staten";
    };
    void unlock()
    {
        if (m_bLock)
            boost::mutex::unlock();
        else
            cout << "Mutex is in unlock staten";
    }
    boost::mutex& getMutex()
    {
        return *this;
    }
private:
    bool m_bLock;
};

编辑:是的,你是对的。我应该使用RAII。然而,我有一个情况。我需要在另一个线程完成处理之前锁定资源。如下所示

Thread A:
void getDate()
{
 m_oLock.lock();
 // access resource
}
void unlock()
{
 m_oLock.unlock();
}
Thread B:
void Process()
{
 threadA.getData();
 threadA.unlock();
}

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

可能的根本原因:
你得到的错误表明你在一个从未被锁定的互斥体上调用unlock。例如:

boost::mutex m;   
m.unlock(); 

通过尝试做lockunlock,似乎您失去了互斥是否被锁定的跟踪。这是手动执行资源管理时经常出现的问题。c++允许一种特殊的机制叫做资源分配是初始化(RAII),用于安全防范此类问题。

建议解决方案:
您应该使用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;
};

我有同样的错误(这就是我如何发现这个问题)。我通过向相关线程添加join来解决问题。我的主进程在线程完成之前就完成了,mutex在被解锁之前就被拆除了。

POSIX声明pthread_mutex_destroy操作返回的唯一错误是:如果互斥锁无效,则返回EINVAL;如果有人正在使用它(显式地或通过条件变量),则返回EBUSY

最可能的情况是第二种。

然而,我在任何代码中都没有看到m_bLock成员变量的任何更改。您确定不想在lockunlock调用中更改此变量吗?

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