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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值