gpt4 book ai didi

c++ - pthread_mutex_lock 错误

转载 作者:太空狗 更新时间:2023-10-29 11:47:12 27 4
gpt4 key购买 nike

#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_ */

最佳答案

我想知道您的互斥锁实例是否由于复制或赋值操作而被丢弃(您甚至可能没有意识到)。互斥锁是不可复制的——您应该通过将复制构造函数和 operator=() 设为私有(private)和未实现(或类似技术)来确保您拥有的包装类不能被复制:

#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_ */

另请注意:在我看来,此类的私有(private)继承可能比公共(public)继承更合适。

关于c++ - pthread_mutex_lock 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6942696/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com