论坛首页 编程语言技术论坛

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

浏览 2889 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2008-11-14   最后修改:2008-12-08
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;
}

 

论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics