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

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

最佳答案

Do Not继承自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;
};

关于c++ - boost::mutex::~mutex(): 断言 `!pthread_mutex_destroy(&m)' 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7817161/

相关文章:

c++ - 在 Android 上使用 Boost.Log 进行 logcat

c++ - 为什么这个非递归互斥量可以获取两次呢?

go - 有没有办法使用 atomic.AddUint64 重置计数器递增?

c++ - 单例的每个核心设计的 IO 服务

c++ - 基于类实现功能困难

c++ - 结合 C++ 和 C

c++ - [[除了属性外还有什么 'alternate grammar'?

C++ Comparator 函数指定映射的特定键顺序?

c++ - 挥之不去的打开文件导致 "Too many open files"

c++ - 是否可以在 visual studio 2008 64 位版本中使用 boost 库?