2022年Linux高级环境编程实验报告 2.pdf

上传人:C****o 文档编号:32540844 上传时间:2022-08-09 格式:PDF 页数:6 大小:94.23KB
返回 下载 相关 举报
2022年Linux高级环境编程实验报告 2.pdf_第1页
第1页 / 共6页
2022年Linux高级环境编程实验报告 2.pdf_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《2022年Linux高级环境编程实验报告 2.pdf》由会员分享,可在线阅读,更多相关《2022年Linux高级环境编程实验报告 2.pdf(6页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、作业报告学生姓名:学 号:指导教师:学生 E-mail:一、作业名称:自定义消息队列二、作业要求自行设计一个消息队列(不能依赖已有库的队列),实现一般队列的操作:入列、出列以及队列判空,另外要保证线程安全,并且能够接收CLMessage类继承体系的消息; 需要提供发送消息的通信类, 以及循环消息的管理类, 保证能够支持线程之间的通信。三、设计与实现根据要求分析, 首先不能依赖已有库的队列, 我们可以利用单链表来创建一个队列,对于消息的出队与入队操作,需要设定两个指针,头指针和尾指针,分别指向队头和队尾,根据队列的要求,队头处只能读(出队),队尾只能写(入队) 。对于判空操作,设定队头指针等于队

2、尾指针时为空。代码清单3.1 自定义队列的实现struct CLNode /链表节点 T data; struct CLNode *next; ; template class CLMyQueue private: struct CLNode *QueueHead;/队头指针struct CLNode *QueueTail;/队尾指针名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 6 页 - - - - - - - - - public: CLMyQueue(); CLM

3、yQueue(); void Push(T data); /数据入队操作T Pop(); /数据出队操作bool IsEmpty();/不能从空队列读数据,因此需进行队列判空; template CLMyQueue:CLMyQueue() /构造函数中对队列进行初始化操作, 队头、队尾置空 QueueHead = NULL; QueueTail = NULL; template CLMyQueue:CLMyQueue() /析构函数清空队列中的所有数据 while (QueueHead != NULL) /队头不为空,则清除队头,继续找队头的后继结点,删除所有的结点数据 struct CLNo

4、de *t = QueueHead; QueueHead = QueueHead-next; delete t; template void CLMyQueue:Push(T data)/数据入队操作 if (IsEmpty()/ 如果队列为空,将数据入队,并且队头和队尾指针都指向该数据 QueueHead = new struct CLNode; QueueHead-data = data; QueueTail = QueueHead; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - -

5、第 2 页,共 6 页 - - - - - - - - - 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;/ 取

6、出对头数据,并修改队头指针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 中给出了入队和出队的操作,分别是Push 和 Pop名师资料总结 - - -精品资料欢

7、迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 6 页 - - - - - - - - - 函数,当然,要注意一些细节,在出队时要判断队列是否为空,若为空则无法进行出队操作,同样在进行入队操作是要判断是否队满。四、测试自定义两个 CLMessage类的继承体,封装乘法操作的CLMultipMessage 消息类和 CLQuitMessage退出消息类,定义子线程的回调函数, 即子线程的执行体。在 main()函数中,创建子线程,主线程向消息队列传递CLSUBMessage 消息和CLQuitMessage

8、消息。子线程从队列中获取消息,并执行相应消息体操作如减法操作和退出操作。代码清单4.1 测试代码class CLMsgPro; class CLMultipMessage : public CLMessage /继承 CLMessage的乘法消息 public: friend class CLMsgPro; CLMultipMessage(int Op1,int Op2):CLMessage(MULTIP_MSG) /构造函数初始化 m_Op1=Op1; m_Op2=Op2; virtual CLMultipMessage() int m_Op1; int m_Op2; ; class CLQ

9、uitMessage : public CLMessage /继承 CLMessage的退出消息 public: CLQuitMessage() : CLMessage(QUIT_MSG) virtual CLQuitMessage() ; class CLMsgPro : public CLMessageObserver /CLMsgPro 继承 CLMessageObserver ,是线程执行体 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 6 页 - - - -

10、- - - - - public: CLMsgPro() virtual CLMsgPro() virtual CLStatus Initialize(CLMessageLoopManager *pMessageLoop, void* pContext) /注册回调函数到线程,用于绑定,可以找到具体做什么操作pMessageLoop-Register(MULTIP_MSG, (CallBackForMessageLoop)(&CLMsgPro:Do_MultipMsg); pMessageLoop-Register(QUIT_MSG , (CallBackForMessageLoop)(&CL

11、MsgPro:Do_QuitMsg); return CLStatus(0, 0); CLStatus Do_MultipMsg(CLMessage *pM) CLMultipMessage *pMultipMsg = (CLMultipMessage *)pM; coutm_Op1*pMultipMsg-m_Op2endl; / 加法消息return CLStatus(0, 0); CLStatus Do_QuitMsg(CLMessage *pM) coutquit.endl; /退出消息return CLStatus(QUIT_MESSAGE_LOOP, 0); ; int main()

12、 CLThreadForMsgLoop myTthread(new CLMsgPro, childThread, true); /创建线程myTthread.Run(0); CLExecutiveNameServer:PostExecutiveMessage(childThread, new CLMultipMessage(3,2); /向 childThread 线程发送消息CLExecutiveNameServer:PostExecutiveMessage(childThread, new CLQuitMessage(); return 0; 代码清 单 4.1 是自 定义消 息队 列程

13、序的 测试代 码, 在 main 函数中 创建CLThreadForMsgLoop类的对象,向 childThread 线程发送乘法消息,提供参数3和 2(做 3*2 的乘法运算),最后退出。测试效果见图4-1:名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 6 页 - - - - - - - - - 图 4-1 测试结果五、对本课程或本作业的建议和意见本次作业通过自定义消息队列,实现线程之间的通信和协作,通过练习, 更加熟悉消息队列的工作机制。 不过在这过程中还是出现很多问题,需要一步一步的去解决,要将一些细节问题考虑进去,完善上面的设计还有很多工作要做。六、附录具体实现代码见 src文件夹。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 6 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁