开源中文网

您的位置: 首页 > 编程开发 > C++语言编程 > 正文

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[QUEUESIZE]; 
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[rear] = 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 = (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[1024]; 
}; 

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; 

Tags:队列 线程 模板
关于开源中文网 - 联系我们 - 广告服务 - 网站地图 - 版权声明