Linux高级环境编程实验报告3
作 业 报 告
学生姓名: 学 号: 指导教师:
学生E-mail:
一、作业名称: 自定义消息队列
二、作业要求
自行设计一个消息队列(不能依赖已有库的队列),实现一般队列的操作:入列、出列以及队列判空,另外要保证线程安全,并且能够接收CLMessage类继承体系的消息;需要提供发送消息的通信类,以及循环消息的管理类,保证能够支持线程之间的通信。
三、设计与实现
根据要求分析,首先不能依赖已有库的队列,我们可以利用单链表来创建一个队列,对于消息的出队与入队操作,需要设定两个指针,头指针和尾指针,分别指向队头和队尾,根据队列的要求,队头处只能读(出队),队尾只能写(入队)。对于判空操作,设定队头指针等于队尾指针时为空。
代码清单3.1 自定义队列的实现
struct CLNode//链表节点
{
T data;
struct CLNode *next;
};
template
class CLMyQueue
{
private:
struct CLNode *QueueHead;//队头指针
struct CLNode *QueueTail;//队尾指针
public:
CLMyQueue();
~CLMyQueue();
void Push(T data); //数据入队操作
T Pop(); //数据出队操作
bool IsEmpty();//不能从空队列读数据,因此需进行队列判空
};
template
CLMyQueue::CLMyQueue()//构造函数中对队列进行初始化操作,队头、队尾置空
{
QueueHead = NULL;
QueueTail = NULL;
}
template
CLMyQueue::~CLMyQueue()//析构函数清空队列中的所有数据
{
while (QueueHead != NULL) //队头不为空,则清除队头,继续找队头的后继结点,删除所有的结点数据
{
struct CLNode *t = QueueHead;
QueueHead = QueueHead->next;
delete t;
}
}
template
void CLMyQueue::Push(T data)//数据入队操作
{
if (IsEmpty())//如果队列为空,将数据入队,并且队头和队尾指针都指向该数据
{
QueueHead = new struct CLNode;
QueueHead->data = data;
QueueTail = QueueHead;
return;
}
//在队尾插入数据
struct CLNode *newNode = new struct CLNode;
newNode->data = data;
newNode->next = NULL;
QueueTail->next = newNode;
QueueTail = newNode;
}
template
T CLMyQueue::Pop()//数据出队操作
{
if (IsEmpty())//不能从空队列中读数据,因此判定队列是否为空,空则返回空指针
{
return NULL;
}
T data = QueueHead->data;//取出对头数据,并修改队头指针
struct CLNode *t = QueueHead;
QueueHead = QueueHead->next;
delete t;
return data;
}
template
bool CLMyQueue::IsEmpty()//判断队列是否为空
{
if (QueueHead == NULL) //当队头指针为空时,队列为空
{
return true;
}
return false;
}
代码清单3.1给出了自定义消息队列的实现。开始定义了单链表结点的结构。在自定义队列类CLMyQueue中给出了入队和出队的操作,分别是