+ -
当前位置:首页 → 问答吧 → 封装了一个线程安全的queue,欢迎大家挑刺

封装了一个线程安全的queue,欢迎大家挑刺

时间:2010-07-14

来源:互联网

template <class Object> class ThreadQueue {
private:   
    std::queue <Object> que;
    pthread_mutex_t mutex;   
public:   
    ThreadQueue();   
    ~ThreadQueue();   
public:   
    bool IsEmpty();   
    void Push(Object *obj);   
    void Pop();
    int Count();
    void Front(Object *obj);
    void Back(Object *obj);
    void Clear();
};   

template <class Object> ThreadQueue<Object>::ThreadQueue()
{   
    pthread_mutex_init(&mutex, NULL);  
}

template <class Object> ThreadQueue<Object>::~ThreadQueue()   
{   
    pthread_mutex_destroy(&mutex);  
}   

template <class Object> bool ThreadQueue<Object>::IsEmpty()   
{   
    int i;
    pthread_mutex_lock(&mutex);   
    i = que.size();  
    pthread_mutex_unlock(&mutex);  
    if(i == 0)   
        return true;   
    else  
        return false;
}

template <class Object> void ThreadQueue<Object>:ush(Object* obj)   
{   
    pthread_mutex_lock(&mutex);   
    que.push(*obj);   
    pthread_mutex_unlock(&mutex);   
}   

template <class Object>void ThreadQueue<Object>:op()   
{   
    pthread_mutex_lock(&mutex);   
    que.pop();
    pthread_mutex_unlock(&mutex);   
}   

template <class Object> int ThreadQueue<Object>::Count()   
{   
    int i = 0;
    pthread_mutex_lock(&mutex);   
    i = que.size();   
    pthread_mutex_unlock(&mutex);
    return(i);   
}

template <class Object>void ThreadQueue<Object>::Front(Object *obj)   
{   
    if(IsEmpty())   
    {   
      obj = NULL;
      return;   
    }   
    pthread_mutex_lock(&mutex);   
    *obj = que.front();
    pthread_mutex_unlock(&mutex);   
    return;   
}

template <class Object>void ThreadQueue<Object>::Back(Object *obj)   
{   
    if(IsEmpty())   
    {   
      obj = NULL;
      return;   
    }   
    pthread_mutex_lock(&mutex);   
    *obj = que.back();
    pthread_mutex_unlock(&mutex);   
    return obj;   
}

template <class Object>void ThreadQueue<Object>::Clear()   
{   
    Object* obj;
    pthread_mutex_lock(&mutex);   
    while (!que.empty())
    {
      *obj = que.front();
      que.pop();
      delete obj;
    }
    pthread_mutex_unlock(&mutex);   
    return;   
}

作者: caicai15   发布时间: 2010-07-14

简单封装

作者: hellioncu   发布时间: 2010-07-14

测试过可以正常使用,但还是不是很有信心。。。。。

作者: caicai15   发布时间: 2010-07-14

队列不设置大小吗?极限情况下会出大问题的。一般情况下,我都是预先申请一块内存,然后串成链表做队列,这样速度快,大小可控。

作者: mirnshi   发布时间: 2010-07-14

去看看ZThread中的一些队列的实现吧,

作者: srdgame   发布时间: 2010-07-14

回复 caicai15


    用c++ 写队列,太恐怖了。。还是别这么干。。

template <class Object> bool ThreadQueue<Object>::IsEmpty()   
{   
    int i;
    pthread_mutex_lock(&mutex);   
    i = que.size();  
    pthread_mutex_unlock(&mutex);  
    if(i == 0)   
        return true;   
    else  
        return false;
}
这里问题就比较明显, 当函数返回的时候,并不确定,是否真的队列是否为空。 这就意味着。外面,还要加别的锁。。

作者: peidright   发布时间: 2010-07-14