【发布时间】: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