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]