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

时间:2011-10-19 06:01:33

标签: 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;
};

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

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

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

3 个答案:

答案 0 :(得分:8)

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

可能的根本原因:
您收到的错误表示您在从未锁定的互斥锁上调用unlock。类似的东西:

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

尝试执行lockunlock时,您似乎无法将互斥锁视为已锁定。当您手动执行资源管理时,这通常是个问题。 C ++允许使用一个名为 Resource Allocation is Initilization(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;
};

答案 1 :(得分:3)

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

答案 2 :(得分:2)

POSIX指出,如果互斥锁在某种程度上无效,则pthread_mutex_destroy操作返回的唯一错误为EINVAL,如果有人正在使用它(显式或通过条件变量),则EBUSY

最可能的情况是第二个。

但是,我在任何代码中都没有看到m_bLock成员变量的任何更改。您确定不想在lockunlock来电中更改此变量吗?

如果 正在使用中,您只需要等到使用它的人愿意发布它。任何其他选择都不太适合你: - )