六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 84|回复: 0

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

[复制链接]

升级  68.67%

43

主题

43

主题

43

主题

秀才

Rank: 2

积分
153
 楼主| 发表于 2013-1-27 04:45:55 | 显示全部楼层 |阅读模式
/** 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;} 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表