您的位置:首页 > 运维架构 > Linux

基于Linux的多线程安全队列

2010-12-30 11:37 274 查看
线程队列头文件  threadqueue.h

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


主函数

 

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息