【问题标题】:pthread_mutex_lock errorpthread_mutex_lock 错误
【发布时间】:2011-08-04 13:55:01
【问题描述】:
#include "MutexCondition.h"

bool MutexCondition::init(){
    printf("MutexCondition::init called\n");
    pthread_mutex_init(&m_mut, NULL);
    pthread_cond_init(&m_con, NULL);
    return true;
}

bool MutexCondition::destroy(){
    pthread_mutex_destroy(&m_mut);
    pthread_cond_destroy(&m_con);
    return true;
}

bool MutexCondition::lock(){
    pthread_mutex_lock(&m_mut);
    return true;
}

bool MutexCondition::unLock(){
    pthread_mutex_unlock(&m_mut);
    return true;
}

bool MutexCondition::wait(){
    pthread_cond_wait(&m_con, &m_mut);
    return true;
}

bool MutexCondition::signal(){
    pthread_cond_signal(&m_con);
    return true;
}

我正在做一个网络编程,我有一个扩展 MutexCondition 的 Sound 类

#ifndef SOUND_H_
#define SOUND_H_

#include <list>
#include "SoundMetaData.h"
#include "SoundSignature.h"
#include "../MutexCondition.h"

using namespace std;

class Sound : public MutexCondition{

private:
    SoundMetaData *m_metaData;
    list<SoundSignature*> m_soundSignatureList;

public:
    Sound(SoundMetaData *metaData);
    virtual ~Sound();
    SoundMetaData* getSoundMetaData();
    list<SoundSignature*> getSoundSignatureList();

    bool addApplication(string &application);
    bool removeApplication(string &application);
    void addSoundSignature(SoundSignature* signature);

};

#endif /* SOUND_H_ */

如果我在 gdb 上运行我的服务器。它在函数 getSoundSignatureList 中的 pthread_mutex_lock () 上炸毁。

list<SoundSignature *> Sound::getSoundSignatureList(){
    lock();
    list<SoundSignature*> list(m_soundSignatureList);
    unLock();
    return list;
}

我有一个名为 Engine 的类,5 个不同的线程根据收到的数据包类型创建 Engine 类。 Engine 类中的一个函数调用 getSoundSignatureList 类。还有其他地方可以调用 Engine 类。

我不明白它怎么会在 pthred_mutex_lock 上爆炸

我该如何解决这个问题?感谢您的帮助

编辑 .h 文件

#ifndef MUTEXCONDITION_H_
#define MUTEXCONDITION_H_

#include <pthread.h>
#include <stdio.h>

class MutexCondition {

private:
    bool init();
    bool destroy();

protected:

    pthread_mutex_t m_mut;
    pthread_cond_t m_con;

public:
    MutexCondition(){
        init();
    }
    virtual ~MutexCondition(){
        destroy();
    }

    bool lock();
    bool unLock();
    bool wait();
    bool signal();

};
#endif /* MUTEXCONDITION_H_ */

【问题讨论】:

  • 你在哪里调用MutexCondition::init()函数?是从默认构造函数调用的吗?
  • 请检查我的更新..我也添加了 .h 文件
  • 你确定你调用了init吗?您可能应该将初始化代码放在构造函数中,将销毁代码放在析构函数中。
  • 这似乎很合适——你能检查pthread_mutex_init()的返回值吗,它应该返回0成功。
  • 我不确定这是否重要,但还有几个类扩展了 MutexCondition 类,并且这些类在没有此错误的情况下运行。 (或者我很幸运)

标签: c++ c linux networking pthreads


【解决方案1】:

我想知道您的互斥量实例是否由于复制或分配操作而被丢弃(您甚至可能不知道)。互斥锁是不可复制的——你应该确保你拥有的包装类不能通过将 copy-ctor 和 operator=() 设为私有和未实现(或类似技术)来复制:

#ifndef MUTEXCONDITION_H_
#define MUTEXCONDITION_H_

#include <pthread.h>
#include <stdio.h>

class MutexCondition {

private:
    bool init();
    bool destroy();

    // idiom to prevent copying: don't implement these
    MutexCondition( MutexCondition const&);
    void operator=( MutexCondition const&);

protected:

    pthread_mutex_t m_mut;
    pthread_cond_t m_con;

public:
    MutexCondition(){
        init();
    }
    virtual ~MutexCondition(){
        destroy();
    }

    bool lock();
    bool unLock();
    bool wait();
    bool signal();

};
#endif /* MUTEXCONDITION_H_ */

另一个注意事项:在我看来,这个类的私有继承可能比公共继承更合适。

【讨论】:

  • 好建议。如果您不禁止并且不小心,复制可能会偷偷摸摸。
猜你喜欢
  • 2020-02-24
  • 2010-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2011-09-21
相关资源
最近更新 更多