c++ 多線程同步問題


#ifndef CCONDITION_H_
#define CCONDITION_H_
#include <pthread.h>
#include <sys/time.h>
#include <unistd.h>

#include "CThreadMutex.h"
using namespace std;
namespace gateway {
class CCondition {
protected:
pthread_cond_t cond;
pthread_condattr_t cond_attr;

public:

CCondition();
virtual ~CCondition();
int Wait(CThreadMutex *cmutex);
int Wait(CThreadMutex &cmutex);
int timedWait(CThreadMutex *cmutex, struct timespec &timeout);
    void Signal(void);
};
}
#endif /* CCONDITION_H_ */


#include "CCondition.h"
namespace gateway {

CCondition::CCondition() {

pthread_condattr_init(&cond_attr);
pthread_cond_init(&cond,&cond_attr);
}
CCondition::~CCondition() {
}
int CCondition::Wait(CThreadMutex *cmutex) {
pthread_mutex_t *m_Mutex = cmutex->GetMutex();
return pthread_cond_wait(&cond, m_Mutex);
}
int CCondition::Wait(CThreadMutex &cmutex) {
pthread_mutex_t *m_Mutex = cmutex.GetMutex();
return pthread_cond_wait(&cond, m_Mutex);
}

int  CCondition::timedWait(CThreadMutex *cmutex, struct timespec &timeout){
pthread_mutex_t *m_Mutex = cmutex->GetMutex();
return pthread_cond_timedwait(&cond, m_Mutex, &timeout);

}
void CCondition::Signal(void) {
pthread_cond_signal(&cond);
}
}

/*
 * CThreadMutex.h
 *
 *  Created on: 2009-11-3
 *      Author: zhangjg
 */

#ifndef CTHREADMUTEX_H_
#define CTHREADMUTEX_H_
#include <pthread.h>
using namespace std;
namespace gateway {
class CThreadMutex {
   //friend class CCondition;
protected:
pthread_mutex_t      m_Mutex;
pthread_mutexattr_t  m_MutexAttr;
public:
CThreadMutex();
virtual ~CThreadMutex();
pthread_mutex_t* GetMutex( ) { return &m_Mutex; }
int Lock();
int Unlock();
int Trylock();
};
}
#endif /* CTHREADMUTEX_H_ */


/*
 * CThreadMutex.cpp
 *
 *  Created on: 2009-11-3
 *      Author: zhangjg
 */

#include "CThreadMutex.h"
namespace gateway {
CThreadMutex::CThreadMutex() {
// TODO Auto-generated constructor stub
pthread_mutexattr_init(&m_MutexAttr);
pthread_mutex_init(&m_Mutex, &m_MutexAttr);
}

CThreadMutex::~CThreadMutex() {
pthread_mutexattr_destroy(&m_MutexAttr);
pthread_mutex_destroy(&m_Mutex);
}
int CThreadMutex::Lock(){ return pthread_mutex_lock(&m_Mutex); }
int CThreadMutex::Unlock() { return pthread_mutex_unlock(&m_Mutex); }
int CThreadMutex::Trylock(){ return pthread_mutex_trylock(&m_Mutex); }
}



/*
 * CList.h
 *
 *  Created on: 2009-11-28
 *      Author: zhangjg
 */

#ifndef CLIST_H_
#define CLIST_H_
#include <list>
#include <iostream>
#include <exception>
#include <errno.h>
#include <sys/time.h>
#include <unistd.h>
#include "../thread/CCondition.h"
#include "../thread/CThreadMutex.h"
using namespace std;
namespace gateway {
template<class T1>
class CList {
private:
list<T1> m_list;
CThreadMutex m_mutex;
CCondition m_cond;
public:

CList() {
}
;

CList& operator =(const CList &rhs) {
this->m_list = rhs.m_list;
return *this;
};


virtual ~CList() {
   m_list.clear();
         };

void pushE(T1 t1) {
  try{
m_mutex.Lock();
m_list.push_back(t1);
m_mutex.Unlock();
m_cond.Signal();

  }catch(std::exception& e){
  cout<<"CList Error"<<e.what()<<endl;
  }
};


void popE(T1 &p) {

m_mutex.Lock();
try{
  if (m_list.empty()) {
    m_cond.Wait(m_mutex);
  }
  p =m_list.front();
  m_list.remove(p);

  }catch(std::exception& e){
  cout<<"CList Error"<<e.what()<<endl;
  }
  m_mutex.Unlock();

};


};
}
#endif /* CLIST_H_ */


CList 是我自己寫的一個類,一個線程調用pushE成員函數,往list中加對象,然后另外一個線程調用popE,從list中取對象,可是有時取出的對象是不可訪問的,不知道為什么?是不是線程同步寫的有問題,大家幫忙看看

5 个解决方案

#1


沒有一點注釋。。太難懂了。。

#2


m_list.remove(p);

改成m_list.pop_front();

remove有可能刪除多個相同的元素

#3


看不懂撒~~~~~~~~~

#4



void popE(T1 &p) {

m_mutex.Lock();
try{
if (m_list.empty()) {
m_cond.Wait(m_mutex);
}
p =m_list.front();
m_list.remove(p);

當list為空時,進入popE函數,是否仍然會從中取出元素?

#5


void popE(T1 &p) {

m_mutex.Lock();
try{
if (m_list.empty()) {
m_cond.Wait(m_mutex);
}
p =m_list.front();
m_list.remove(p);
理論上,C/C++ code
void popE(T1 &p) {

m_mutex.Lock();
try{
if (m_list.empty()) {
m_cond.Wait(m_mutex);
}
p =m_list.front();
m_list.remove(p);

理論上,當list為空時,進入popE函數,不會從中取出元素

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com