cissco 发表于 2013-1-27 04:45:55

Linux下 基于模板的C++多线程安全队列

/** ThreadQueue.h** Created on: 2008-11-13*      Author: root*/#ifndef THREADQUEUE_H_#define THREADQUEUE_H_#include <pthread.h>#include <iostream>using std::cout;using std::endl;const int QUEUESIZE = 20;template<class Object>class ThreadQueue{public:    ThreadQueue();    ~ThreadQueue();public:    bool Enter(Object *obj);    Object* Out();    bool IsEmpty();    bool IsFull();private:    int front;    int rear;    int size;    Object *list;    pthread_mutex_t queueMutex;};//------------------------------------------------------template<class Object>ThreadQueue<Object>::ThreadQueue(){    front = rear = 0;    size = QUEUESIZE;    pthread_mutex_lock(&queueMutex);}//------------------------------------------------------template<class Object>bool ThreadQueue<Object>::Enter(Object* obj){    pthread_mutex_lock(&queueMutex);    if(IsFull())    {      cout << "Queue is full!" << endl;      pthread_mutex_unlock(&queueMutex);      return false;    }    list = obj;    rear = (rear + 1) % size;    pthread_mutex_unlock(&queueMutex);    return true;}//------------------------------------------------------template<class Object>Object* ThreadQueue<Object>::Out(){    Object* temp;    pthread_mutex_lock(&queueMutex);    if(IsEmpty())    {      cout << "Queue is empty!" << endl;      pthread_mutex_unlock(&queueMutex);      return false;    }    temp = list;    front = (front + 1) % size;    pthread_mutex_unlock(&queueMutex);    return temp;}//------------------------------------------------------template<class Object>bool ThreadQueue<Object>::IsEmpty(){    if(rear == front)      return true;    else      return false;}//------------------------------------------------------template<class Object>bool ThreadQueue<Object>::IsFull(){    if((rear + 1) % size == front)      return true;    else      return false;}//------------------------------------------------------template<class Object>ThreadQueue<Object>::~ThreadQueue(){    delete []list;}//------------------------------------------------------#endif /* THREADQUEUE_H_ */以下为main.cpp/** main.cpp** Created on: 2008-11-13*      Author: root*/#include "ThreadQueue.h"#include <iostream>using namespace std;struct Data{    int fd ;    //char buf;};int main(){    ThreadQueue<Data> *t = new ThreadQueue<Data>();    int k = 10;    for(int i = 1; i <= 10; i++)    {      Data* d = new Data();      d->fd = i;    //    strcpy(d->buf,"AAAA");      bool a = t->Enter(d);      if(a)            cout << "true" << endl;      else            cout << "false" << endl;    }    Data *temp;    //int *temp;    for(int i = 1; i <= 10; i++)    {      //temp = t->Out();      //cout << *temp << endl;      temp = t->Out();      cout << temp->fd << endl;      //cout << temp->buf << endl;      delete temp;    }    return 0;} 
页: [1]
查看完整版本: Linux下 基于模板的C++多线程安全队列