2011-08-04 34 views
2
#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; 
} 

我工作的一個網絡編程和我有這個和Sound類延伸MutexCondition錯誤的pthread_mutex_lock

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

你在哪裏調用'MutexCondition :: init()'函數?它是從默認構造函數調用的嗎? – Chad

+0

請檢查我的更新..我還添加了.h文件以及 – user800799

+0

你確定你已經調用過init嗎?您應該將init代碼放入構造函數中,並將destroy代碼放入析構函數中。 – Kevin

回答

4

我不知道,如果你的互斥實例將被丟棄由於複製或賦值操作(即你可能甚至不知道的)。互斥是不可拷貝 - 你應該確保您對無法通過使拷貝構造函數和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_ */ 

另一個注意:在我看來,這個類的私有繼承可能比公有繼承更合適。

+0

好的建議。如果您不禁止複製,您可能會偷偷摸摸地看着你,而且你不小心。 – Chad

相關問題