封装了一个线程安全的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;
}
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>:

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

{
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;
}
这里问题就比较明显, 当函数返回的时候,并不确定,是否真的队列是否为空。 这就意味着。外面,还要加别的锁。。

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
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28