pthread_mutex_lock error

pthread_mutex_lock error

本文关键字:error lock mutex pthread      更新时间:2023-10-16
#include "MutexCondition.h"
bool MutexCondition::init(){
    printf("MutexCondition::init calledn");
    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;
}

我正在进行网络编程,我有这个和Sound类扩展了MutexCondition

#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上运行服务器。它在函数getssoundsignaturelist的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上爆炸

如何解决这个问题?谢谢你的帮助

EDIT .h file

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

我想知道您的互斥对象实例是否由于复制或赋值操作而被丢弃(您甚至可能没有意识到)。互斥锁是不可复制的——您应该通过将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_ */
另一个注意事项:在我看来,这个类的私有继承可能比公共继承更合适。
相关文章: