[发明专利]基于消息队列的共享内存写入及读取方法和系统有效
申请号: | 201310684074.7 | 申请日: | 2013-12-12 |
公开(公告)号: | CN103645942B | 公开(公告)日: | 2017-02-01 |
发明(设计)人: | 蔡东赟;王东玉 | 申请(专利权)人: | 北京奇安信科技有限公司 |
主分类号: | G06F9/46 | 分类号: | G06F9/46 |
代理公司: | 北京润泽恒知识产权代理有限公司11319 | 代理人: | 赵娟 |
地址: | 100015 北京市朝阳区酒仙*** | 国省代码: | 北京;11 |
权利要求书: | 查看更多 | 说明书: | 查看更多 |
摘要: | |||
搜索关键词: | 基于 消息 队列 共享 内存 写入 读取 方法 系统 | ||
1.一种基于消息队列的共享内存写入方法,所述消息队列包括第一消息队列,所述方法包括:
采用所述消息队列执行多线程进队push以及单线程出队pop的操作;
将所述单线程出队pop的数据写入共享内存;
其中,所述多线程进队push的操作包括:
判断所述消息队列是否已满;
若否,则分别计算n个线程进队push的偏移量;所述n为大于或等于1的正整数;
依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置Pos;
所述n个线程分别在其进队push的实际位置Pos执行进队push操作;
其中,所述将所述单线程出队pop的数据写入共享内存的步骤包括:
获得所述单线程出队pop的数据及其长度;
检查所述数据的长度是否超出共享内存的长度界限;
若否,则获取所述共享内存的读偏移指针pRead和写偏移指针pWrite;
依据所述读偏移指针pRead和写偏移指针pWrite,以及,所述数据的长度,确定所述数据在共享内存中的写入位置,并判断所述数据是否可写;
若是,则在所述写入位置写入所述数据。
2.根据权利要求1所述的方法,其特征在于,所述判断消息队列是否已满的子步骤进一步包括:
读取可写计数参数CanWriteCount的值;
递减所述CanWriteCount的值;
若获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
3.根据权利要求1或2所述的方法,其特征在于,在所述n个线程分别在其进队push的实际位置执行进队push操作的子步骤之后,所述多线程进队push的操作还包括:
读取可读计数参数CanReadCount的值;
按照所述n个线程进队push的操作,迭代增加所述CanReadCount的值。
4.根据权利要求1所述的方法,其特征在于,所述获取所述共享内存的读偏移指针pRead和写偏移指针pWrite的子步骤进一步包括:
获得所述共享内存的映射文件,所述映射文件包括文件头;
从所述文件头中读取写偏移指针pWrite;
从所述文件头中读取读偏移指针pRead并快照到临时变量中。
5.一种基于消息队列的共享内存读取方法,所述消息队列包括第二消息队列,所述方法包括:
从共享内存中读取数据;
将读出的数据通过单线程进队push的操作压入所述第二消息队列,同时,采用所述第二消息队列执行多线程出队pop的操作;
其中,所述从共享内存中读取数据的步骤包括:
定位待读取数据所在共享内存的位置;
获得所述待读取数据的长度;
获取所述共享内存的读偏移指针pRead和写偏移指针pWrite;
依据所述读偏移指针pRead和写偏移指针pWrite,以及,所述待读取数据的长度,判断所述待读取数据是否可读;
若是,则从所述待读取数据所在共享内存的位置,读出所述待读取数据;
其中,所述多线程出队pop的操作包括:
判断所述消息队列是否已空;
若否,则分别计算n个线程出队pop的偏移量;所述n为大于或等于1的正整数;
依据所述n个线程出队pop的偏移量,分别计算所述n个线程出队pop的实际位置Pos;
所述n个线程分别在其出队pop的实际位置执行出队pop操作。
6.根据权利要求5所述的方法,其特征在于,在所述n个线程分别在其出队pop的实际位置执行出队pop操作的步骤之后,还包括:
读取可写计数参数CanWriteCount的值;
按照所述n个线程出队pop的操作,迭代增加所述CanWriteCount的值。
该专利技术资料仅供研究查看技术是否侵权等信息,商用须获得专利权人授权。该专利全部权利属于北京奇安信科技有限公司,未经北京奇安信科技有限公司许可,擅自商用是侵权行为。如果您想购买此专利、获得商业授权和技术合作,请联系【客服】
本文链接:http://www.vipzhuanli.com/pat/books/201310684074.7/1.html,转载请声明来源钻瓜专利网。