一种基于消息队列的线程间通信的方法和系统的制作方法

文档序号:6523596阅读:167来源:国知局
一种基于消息队列的线程间通信的方法和系统的制作方法
【专利摘要】本发明提供了一种基于消息队列的线程间通信的方法和系统,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,其中,所述多线程进队push的操作包括:判断所述消息队列是否已满;若否,则分别计算n个线程进队push的偏移量;所述n为大于或等于1的正整数;依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置Pos;所述n个线程分别在其进队push的实际位置Pos执行进队push操作。本发明保证了多线程访问操作不碰撞,解决了线程间通信时阻塞的问题,减少了资源消耗,充分利用了系统资源,提高了处理速度,从而提高了服务器吞吐量。
【专利说明】一种基于消息队列的线程间通信的方法和系统【技术领域】
[0001]本发明涉及计算机通信的【技术领域】,特别是涉及一种基于消息队列的线程间通信的方法和系统。
【背景技术】
[0002]吞吐量是指在一次性能测试过程中网络上传输的数据量的总和。对于交互式应用来说,吞吐量指标反映的是服务器承受的压力,在容量规划的测试中,吞吐量指标说明的是系统级别的负载能力。随着用户业务量的不断增长以及企业数据的不断积累,对服务器的吞吐量要求也越来越高。
[0003]服务器为了提高吞吐量,可以采用多线程技术,即主要解决处理器单元内多个线程执行的问题,减少处理器单元的闲置时间,增加处理器单元的吞吐能力的技术。在解决处理器单元内多个线程执行的问题时,要求线程不仅要同步地访问同一共享资源,而且线程间还彼此牵制,通过相互通信来向前推进。
[0004]现有技术中,线程间通信的方式为消息传递方式,线程之间通过进队push和出队pop指令操作消息队列来传递信息。这些线程之间的关系是平等的,彼此之间并不存在任何依赖,它们各自竞争CPU资源,互不相让,就可能存在这样的危险:一个线程以某种其他线程不可预料的方式修改资源。例如,两个线程都对同一个文件进行读写,两个线程都在进行绘图,一个线程正在使用一段内存而另一个线程却正在修改这段内存的值等,都可能出现不可预料的结果。因而需要保证一段时间内只有一个线程在执行一段指令,从而保证结果的准确性,通常执行进队push和出队pop指令操作时需要采用互斥锁(mutual exclusionlock,也称作mutex)指令的方式无条件地阻止其他线程对共享资源的异步访问,这就意味着至多只有一个线程可以拥有锁,并开始处理锁中做的事,释放锁后,再处理锁外做的事。例如,当线程A尝试请求一个 被线程B占有的锁时,线程A必须等待或者阻塞,此时线程A被挂起,直到线程B释放锁后,线程A才拥有锁,并开始处理锁中做的事,如果线程B永远不释放锁,线程A将永远等待或者阻塞下去;还有一种情况是,多个线程获取同一个消息队列的数据,所有出队pop指令操作也需要采用互斥锁,以阻塞其他空闲进程同时执行任务。因此,采用互斥锁指令的方式非常消耗资源,并且,进队push和出队pop指令操作无法同时进行,一个线程总是被另外一个线程阻塞而无法充分利用系统资源。

【发明内容】

[0005]鉴于上述问题,提出了本发明以便提供一种克服上述问题或者至少部分地解决上述问题的一种基于消息队列的线程间通信的方法和相应的一种基于消息队列的线程间通信的系统。
[0006]依据本发明的一个方面,提供了一种基于消息队列的线程间通信的方法,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,其中,所述多线程进队push的操作包括:[0007]判断所述消息队列是否已满;
[0008]若否,则分别计算n个线程进队push的偏移量;所述n为大于或等于I的正整数;
[0009]依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置Pos ;
[0010]所述n个线程分别在其进队push的实际位置Pos执行进队push操作。
[0011]可选地,所述判断消息队列是否已满的步骤包括:
[0012]读取可写计数参数CanWriteCount的值;
[0013]递减所述CanWriteCount 的值;
[0014]若获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
[0015]可选地,所述分别计算n个线程进队push的偏移量的步骤包括:
[0016]读取进队push的偏移量Pushpos的值;
[0017]针对所述n个线程迭代增加所述Pushpos的值,分别获得所述n个线程进队push
的偏移量。
[0018]可选地,所述分别计算所述n个线程进队push的实际位置Pos的步骤包括:
[0019]读取所述消息队列大小参数Size的值;
[0020]采用所述Size的值对所述Pushpos的值取模,获得对应的n个线程进队push的实际位置Pos。
[0021]可选地,在所述n个线程分别在其进队push的实际位置执行进队push操作的步骤之后,还包括:
[0022]读取可读计数参数CanReadCount的值;
[0023]按照所述n个线程进队push的操作,迭代增加所述CanReadCount的值。
[0024]可选地,所述单线程出队pop的操作的步骤为:
[0025]单个线程依次在所述消息队列中执行出队pop操作。
[0026]可选地,还包括:
[0027]若所述消息队列已满,则禁止执行进队push的操作。
[0028]依据本发明的另一个方面,提供了一种基于消息队列的线程间通信的方法,采用所述消息队列执行单线程进队push以及多线程出队pop的操作,其中,所述多线程出队pop的操作包括:
[0029]判断所述消息队列是否已空;
[0030]若否,则分别计算n个线程出队pop的偏移量;所述n为大于或等于I的正整数;
[0031]依据所述n个线程出队pop的偏移量,分别计算所述n个线程出队pop的实际位置 Pos ;
[0032]所述n个线程分别在其出队pop的实际位置执行出队pop操作。
[0033]可选地,所述判断消息队列是否已空的步骤包括:
[0034]读取可读计数参数CanReadCount的值;
[0035]递减所述CanReadCount 的值;
[0036]若获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。[0037]可选地,所述分别计算η个线程出队pop的偏移量的步骤还包括:
[0038]读取出队pop的偏移量Poppos的值;
[0039]针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的
偏移量。
[0040]可选地,所述分别计算所述η个线程出队pop的实际位置Pos的步骤还包括:
[0041]读取所述消息队列大小参数Size的值;
[0042]采用所述Size的值对所述Poppos的值取模,获得对应的η个线程出队pop的实际位置Pos。
[0043]可选地,在所述η个线程分别在其出队pop的实际位置执行出队pop操作的步骤之后,还包括:
[0044]读取可写计数参数CanWriteCount的值;
[0045]按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0046]可选地,所述单线程进队push的操作包括:
[0047]单个线程依次在所述消息队列中执行进队push操作。
[0048]可选地,还包括:
[0049]若所述消息队列已空,则禁止执行出队pop的操作。
[0050]依据本发明的另一个方面,提供了一种基于消息队列的线程间通信的方法,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,或者,采用所述消息队列执行单线程进队push以及多线程出队pop的操作;
[0051]其中,所述多线程进队push的操作包括:
[0052]读取可写计数参数CanWriteCount的值;
[0053]递减所述CanWriteCount 的值;
[0054]若获得递减后的CanWriteCount的值不为O,则判定所述消息队列为未满;
[0055]在所述消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0056]依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际
位置;
[0057]所述η个线程分别在其进队push的实际位置执行进队push操作;
[0058]读取可读计数参数CanReadCount的值;
[0059]按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值;
[0060]其中,所述多线程出队pop的操作包括:
[0061]读取可读计数参数CanReadCount的值;
[0062]递减所述CanReadCount 的值;
[0063]若获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空;
[0064]在所述消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0065]依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0066]所述η个线程分别在其出队pop的实际位置执行出队pop操作;[0067]读取可写计数参数CanWriteCount的值;
[0068]按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0069]依据本发明的另一个方面,提供了一种基于消息队列的线程间通信的系统,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,其中,所述多线程进队push模块包括:
[0070]第一判断子模块,用于判断所述消息队列是否已满;
[0071]进队push偏移量计算子模块,用于在消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0072]进队push的实际位置Pos计算子模块,用于依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置Pos ;
[0073]操作进队push子模块,用于所述η个线程分别在其进队push的实际位置Pos执行进队push操作。
[0074]可选地,所述第一判断子模块包括:
[0075]可写计数参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0076]可写计数参数递减子模块,用于递减所述CanWriteCount的值;
[0077]第一判断子模块,用于在获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
[0078]可选地,所述进队push偏移量计算子模块包括:
[0079]偏移量Pushpos读取子模块,用于读取进队push的偏移量Pushpos的值;
[0080]偏移量Pushpos获得子模块,用于针对所述η个线程迭代增加所述Pushpos的值,分别获得所述η个线程进队push的偏移量。
[0081]可选地,所述进队push的实际位置Pos计算子模块包括:
[0082]第一大小参数Size读取子模块,用于读取所述消息队列大小参数Size的值;
[0083]进队push的实际位置Pos获得子模块,用于获得对应的η个线程进队push的实际位置Pos。
[0084]可选地,所述多线程进队push子模块还包括:
[0085]可读计数参数读取子模块,读取可读计数参数CanReadCount的值;
[0086]可读计数参数读迭代增加子模块,按照所述η个线程进队push的操作,迭代增加所述 CanReadCount 的值。
[0087]可选地,所述单线程出队pop模块包括:
[0088]出队pop子模块,用于单个线程依次在所述消息队列中执行出队pop操作。
[0089]可选地,所述方法还包括:
[0090]进队push的操作禁止子模块,用于在所述消息队列已满时,禁止执行进队push的操作。
[0091]本发明还公开了一种基于消息队列的线程间通信的系统,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块,其中,所述多线程出队pop模块包括:
[0092]第二判断子模块,用于判断所述消息队列是否已空;
[0093]出队pop的偏移量计算子模块,用于在消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;[0094]出队pop的实际位置Pos计算子模块,用于依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置Pos ;
[0095]操作出队pop子模块,用于所述η个线程分别在其出队pop的实际位置执行出队pop操作。
[0096]可选地,所述第二判断子模块包括:
[0097]可读计数参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0098]可读计数参数递减子模块,用于递减所述CanReadCount的值;
[0099]第二判断子模块,用于在获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。
[0100]可选地,所述出队pop的偏移量计算子模块还包括:
[0101]偏移量Poppos读取子模块,用于读取出队pop的偏移量Poppos的值;
[0102]偏移量Poppos获得子模块,用于针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的偏移量。
[0103]可选地,所述出队pop的实际位置Pos计算子模块包括:
[0104]第二大小参数读取子模块,用于读取所述消息队列大小参数Size的值;
[0105]出队pop的实际位置Pos计算子模块,用于采用所述Size的值对所述Poppos的值取模,获得对应的η个线程出队pop的实际位置Pos。
[0106]可选地,所述多线程出队pop模块还包括:
[0107]可写计数参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0108]可写计数参数迭代增加子模块,用于按照所述η个线程出队pop的操作,迭代增加所述 CanWriteCount 的值。
[0109]可选地,所述单线程进队push模块包括:
[0110]进队push子模块,用于单个线程依次在所述消息队列中执行进队push操作。
[0111]可选地,还包括:
[0112]出队pop的操作禁止子模块,用于在所述消息队列已空时,则禁止执行出队pop的操作。
[0113]依据本发明的另一个方面,提供了一种基于消息队列的线程间通信的系统,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,或者,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块;
[0114]其中,所述多线程进队push模块包括:
[0115]CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0116]CanffriteCount参数递减子模块,用于递减所述CanWriteCount的值;
[0117]第三判断子模块,用于在获得递减后的CanWriteCount的值不为0,则判定所述消息队列为未满;
[0118]push的偏移量计算子模块,用于在所述消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0119]push的实际位置计算子模块,用于依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置;
[0120]push操作执行子模块,用于所述η个线程分别在其进队push的实际位置执行进队push操作;
[0121]CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0122]CanReadCount参数迭加子模块,用于按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值;
[0123]其中,所述多线程出队pop模块包括:
[0124]CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0125]CanReadCount参数递减子模块,用于递减所述CanReadCount的值;
[0126]第四判断子模块,用于在获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空;
[0127]pop的偏移量计算子模块,用于在所述消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0128]pop的实际位置计算子模块,用于依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0129]pop操作执行子模块,用于所述η个线程分别在其出队pop的实际位置执行出队pop操作;
[0130]CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0131]CanffriteCount参数迭加子模块,用于按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0132]与现有技术相比,本发明包括以下优点:
[0133]本发明通过采用消息队列执行多线程进队push以及单线程出队pop的操作,首先,利用原子操作计算多线程进队push的偏移量,避免了多线程进队push对应的偏移量互相重复,从而计算出多线程进队push不同的实际位置,保证了多线程访问操作不碰撞;其次,利用单个线程依次有序执行出队pop操作,解决了线程间通信时阻塞的问题,减少了资源消耗,充分利用了系统资源,提高了处理速度,从而提高了服务器吞吐量。
[0134]本发明通过采用消息队列执行单线程进队push以及多线程出队pop的操作,首先,利用原子操作计算多线程出队pop的偏移量,避免了多线程出队pop对应的偏移量互相重复,从而计算出多线程出队pop不同的实际位置,保证了多线程访问操作不碰撞;其次,利用单个线程依次有序执行进队push操作,解决了线程间通信时阻塞的问题,减少了资源消耗,充分利用了系统资源,提高了处理速度,从而提高了服务器吞吐量。
[0135]本发明通过判断消息队列已满时,禁止执行进队push的操作,保证了写入数据时的安全性与准确性,从而保证多线程访问成功,解决了线程间通信时阻塞的问题,从而提高服务器吞吐量。
[0136]本发明通过判断消息队列已空时,禁止执行出队pop的操作,保证了读取数据时的安全性与准确性,从而保证多线程访问成功,解决了线程间通信时阻塞的问题,从而提高服务器吞吐量。
[0137]本发明通过迭代增加可读计数参数CanReadCount,保证了线程执行读操作时可读原子数目的准确性,从而保证了线程间通信成功,减少资源消耗,充分利用系统资源,提高处理速度,从而提高服务器吞吐量。
[0138]本发明通过迭代增加可写计数参数CanWriteCount,保证了线程执行写操作时可写原子数目的准确性,从而保证了线程间通信成功,减少资源消耗,充分利用系统资源,提高处理速度,从而提高服务器吞吐量。
【专利附图】

【附图说明】
[0139]图1示出了本发明一种基于消息队列的线程间通信的方法实施例1的步骤流程图;
[0140]图2示出了本发明一种多线程进队push的示意图;
[0141]图3示出了本发明一种基于消息队列的线程间通信的方法实施例2的步骤流程图;
[0142]图4示出了本发明一种基于消息队列的线程间通信的方法实施例3的步骤流程图;
[0143]图5示出了本发明一种多线程出队pop的示意图;
[0144]图6示出了本发明一种基于消息队列的线程间通信的方法实施例4的步骤流程图;
[0145]图7示出了本发明一种基于消息队列的线程间通信的方法实施例5的步骤流程图;
[0146]图8示出了本发明一种基于消息队列的线程间通信的系统实施例1的结构框图;
[0147]图9示出了本发明一种基于消息队列的线程间通信的系统实施例2的结构框图;
[0148]图10示出了本发明一种基于消息队列的线程间通信的系统实施例3的结构框图。
【具体实施方式】
[0149]为使本发明的上述目的、特征和优点能够更加明显易懂,下面结合附图和【具体实施方式】对本发明作进一步详细的说明。
[0150]为使本领域技术人员更好地理解本发明,以下对本发明所涉及的相关技术进行简单说明。
[0151]线程是程序执行流的最小单元。一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。另外,线程是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。
[0152]在单个程序中同时运行多个线程完成不同的工作,称为多线程。一个线程可以创建和撤消另一个线程,同一进程中的多个线程之间可以并发执行。由于线程之间的相互制约,致使线程在运行中呈现出间断性。线程也就有就绪、阻塞和运行三种基本状态。
[0153]线程池是预先创建线程的一种技术。线程池在还没有任务到来之前,创建一定数量的线程,放入空闲队列中。这些线程都是处于睡眠状态,即均为启动,不消耗CPU,而只是占用较小的内存空间。当请求到来之后,缓冲池给这次请求分配一个空闲线程,把请求传入此线程中运行,进行处理。当预先创建的线程都处于运行状态,即预制线程不够,线程池可以自由创建一定数量的新线程,用于处理更多的请求。当系统比较闲的时候,也可以通过移除一部分一直处于停用状态的线程。
[0154]“消息”是进行传送的数据单位。消息可以非常简单,例如只包含文本字符串,也可以更复杂,可能包含嵌入对象。消息被发送到消息队列中。“消息队列”是在消息的传输过程中保存消息的容器。消息队列管理器在将消息从它的源中继到它的目标时充当中间人。消息队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。消息队列是Microsoft的消息处理技术,它在任何安装了 Microsoft Windows的计算机组合中,为任何应用程序提供消息处理和消息队列功能,无论这些计算机是否在同一个网络上或者是否同时联机。
[0155]虽然多线程能带来好处,例如,可以把任务分块执行,分块后任务可以同时进行而不用等待,从而提高效率,但是多线程也有不少问题需要解决。例如,对于像磁盘驱动器这样独占性系统资源,由于线程可以执行进程的任何代码段,且线程的运行是由系统调度自动完成的,具有一定的不确定性,因此就有可能出现两个线程同时对磁盘驱动器进行操作,从而出现操作错误,这种错误非常可怕,出问题的往往是另外一个线程,不是制造事故的第一责任人,因此很难从错误点来跟踪源头,这类错误,一般都应该从一开始就尽量避免。
[0156]针对这个问题,多任务操作系统提出的解决方案就是加锁。在编程中,使用SynchronizationAttribute为ContextBoundObject对象创建简单的,自动的同步。这种同步方式仅用于实例化的方法和域的同步。所有在同一个上下文域的对象共享同一个锁。引入了对象互斥锁的概念,来保证共享数据操作的完整性。每个对象都对应于一个可称为“互斥锁”的标记,这个标记用来保证在任一时刻,只能有一个线程访问该对象。加锁事实上是一种宣告,告知操作系统和CPU,本线程的下面几个动作不能被打断,直到解锁为止。因此,当两个线程都按照“加锁-访问-解锁”这个顺序做事时,如果第一个线程加锁后,第二个线程试图访问加锁的资源,则被系统悬挂等待,直到锁解除后,才可以继续执行,这样就能确保读取到正确的数据。
[0157]因此,多任务环境所有的同步等待动作,一定是以牺牲效率为代价的。这说明,虽然我们用锁解决了线程间对资源的并发争用安全性,但是,随之而来的,就是程序效率大幅度的降低。通过实验可知,原来每秒几万次吞吐量的服务器,在完善了锁安全后,性能降低到每秒只有几百次的吞吐量。
[0158]正是本专利发明人发现这一问题的严重性,创造性地提出本发明实施例的核心构思之一在于,提出一种基于无锁消息队列的多线程通信机制,可以实现采用消息队列执行多线程进队push以及单线程出队pop的操作,或者,采用消息队列执行单线程进队push以及多线程出队pop的操作,从而实现在对消息队列不加锁的情况下,同时执行进队push和出队pop操作,安全地完成线程间通信,并且,线程间没有阻塞,从而能够充分利用系统资源,提高服务器吞吐量。长期以来,本领域技术人员对于多线程并发争用安全性的技术问题,普遍采用在写入数据和读取数据时加锁的方式完成线程间的通信。本专利发明人反其道而行之,采用本领域技术人员由于技术偏见而舍弃的技术手段,通过不加锁的消息队列采用原子操作,多线程访问操作不碰撞的方式完成线程间的通信,从而解决多线程并发争用安全性的技术问题。
[0159]参照图1,示出了本发明一种基于消息队列的线程间通信的方法实施例1的步骤流程图,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,其中,所述多线程进队push的操作具体可以包括:
[0160]步骤101,判断所述消息队列是否已满。[0161]在具体实现中,消息队列是可以在消息的传输过程中保存消息的容器,在多个不同的应用之间实现相互通信的一种异步传输模式,当消息队列为已满时,将禁止在消息队列中写入数据。
[0162]在本发明的一种优选实施例中,所述步骤101具体可以包括如下子步骤:
[0163]子步骤Sll,读取可写计数参数CanWriteCount的值;
[0164]子步骤S12,递减所述CanWriteCount的值;
[0165]子步骤S13,若获得递减后的CanWriteCount的值为O,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
[0166]在具体应用中,原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会切换到另一个线程。多线程进队push操作时,每一个线程分别读取对应的可写计数参数CanWriteCount的值,采用原子操作递减CanWriteCount的值,若获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。若所述消息队列已满,则禁止执行进队push的操作。
[0167]通过判断消息队列已满时,禁止执行进队push的操作,保证了写入数据时的安全性与准确性,从而保证多线程访问成功,解决了线程间通信时阻塞的问题,从而提高服务器吞吐量。
[0168]当然,上述判断消息队列是否为已满的处理方法只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他判断消息队列是否为已满的处理方法,本发明实施例对此不加以限制。另外,除了上述判断消息队列是否为已满的处理方法外,本领域技术人员还可以根据实际需要采用其它判断消息队列是否为已满的处理方法,本发明实施例对此也不加以限制。
[0169]步骤102,若否,则分别计算η个线程进队push的偏移量;所述η为大于或等于I
的正整数。
[0170]在实际应用中,一个双核心的CPU可以拥有4个线程,η的取值取决于任务数量,一个任务分配一个线程,偏移量是指存储单元的实际地址与其所在段的段地址之间的距离,η个线程进队push操作时,每个线程都是采用原子操作递加的方式,计算出来η个线程进队push的偏移量各不相同。
[0171]在本发明的一种优选实施例中,所述步骤102具体可以包括如下子步骤:
[0172]子步骤S201,读取进队push的偏移量Pushpos的值;
[0173]子步骤S202,针对所述η个线程迭代增加所述Pushpos的值,分别获得所述η个线程进队push的偏移量。
[0174]在具体实现中,一个线程读取进队push的偏移量Pushpos的值,采用当前偏移量Pushpos的值执行迭代增加操作,获得该线程进队push的偏移量,下一个线程读取迭代增加操作后的进队push的偏移量Pushpos的值,执行迭代增加操作,获得此线程进队push的偏移量,按上述方法依次针对所述η个线程迭代增加所述Pushpos的值,分别获得所述η个线程进队push的偏移量。
[0175]当然,上述计算η个线程进队push的偏移量的处理方法只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他计算η个线程进队push的偏移量的处理方法,本发明实施例对此不加以限制。另外,除了上述计算η个线程进队push的偏移量的处理方法外,本领域技术人员还可以根据实际需要采用其它计算η个线程进队push的偏移量的处理方法,本发明实施例对此也不加以限制。
[0176]步骤103,依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置Pos。
[0177]在具体实现中,为了保证写入数据不超出消息队列的范围,可以分别计算所述η个线程进队push的实际位置。
[0178]在本发明的一种优选实施例中,所述步骤103具体可以包括如下子步骤:
[0179]子步骤S301,读取所述消息队列大小参数Size的值;
[0180]子步骤S302,采用所述Size的值对所述Pushpos的值取模,获得对应的η个线程进队push的实际位置Pos。
[0181]在实际应用中,Pos=Pushpos%Size,n个线程进队push的偏移量各不相同,因此,η个线程进队push的实际位置Pos也各不相同。这个时候实际位置Pos只有当前线程独自占有。
[0182]当然,上述计算η个线程进队push的实际位置Pos的处理方法只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他计算η个线程进队push的实际位置Pos的处理方法,本发明实施例对此不加以限制。另外,除了上述计算η个线程进队push的实际位置Pos的处理方法外,本领域技术人员还可以根据实际需要采用其它计算η个线程进队push的实际位置Pos的处理方法,本发明实施例对此也不加以限制。
[0183]步骤104,所述η个线程分别在其进队push的实际位置Pos执行进队push操作。
[0184]在具体应用中,计算出了 η个线程进队push的实际位置Pos,就可以在其进队push的实际位置Pos执行进队push操作。
[0185]其中,所述单线程出队pop的操作可以为:
[0186]单个线程依次在所述消息队列中执行出队pop操作。
[0187]在实际应用中,出队pop操作与进队push操作可以同时进行,单个线程有序的读取消息队列中的数据。
[0188]通过采用消息队列执行多线程进队push以及单线程出队pop的操作,利用原子操作计算多线程进队push的偏移量,避免了多线程进队push对应的偏移量互相重复,从而计算出多线程进队push不同的实际位置,保证了多线程访问操作不碰撞,利用单个线程依次有序执行出队pop操作,解决了线程间通信时阻塞的问题,减少了资源消耗,充分利用了系统资源,提高了处理速度,从而提高了服务器吞吐量。
[0189]为便于本领域技术人员更好地理解本发明,以下通过一个具体示例简单说明多线程进队push的方法。
[0190]参照图2,示出了本发明一种多线程进队push的示意图。如图2所示,ThreadUThread2、Thread3、Thread4分别是线程1、线程2、线程3、线程4,图示中消息队列的各个方格表示实际位置。
[0191]在具体应用中,线程1、线程2、线程3、线程4分别执行进队push操作,线程I读取可写计数参数CanWriteCount的值,采用原子操作递减CanWriteCount的值,获得递减后的CanWriteCount的值不为O,然后,读取进队push的偏移量Pushpos的值,采用偏移量Pushpos的值执行迭代增加操作,获得该线程进队push的偏移量,之后,读取消息队列大小参数Size的值,采用Size的值对Pushpos的值取模,得到实际位置,如图2所示的消息队列中第5个方格,此时,第5个方格只有线程I独自占有,线程I在第5个方格执行进队push操作。线程3读取线程I递减后的可写计数参数CanWriteCount的值,在其基础之上执行递减CanWriteCount的值的操作,获得递减后的CanWriteCount的值也不为O,然后,读取线程I进队push的偏移量,在其基础之上执行迭代增加Pushpos的值的操作,采用Size的值对Pushpos的值取模,得到实际位置,如图2所示的消息队列中第6个方格,此时,第6个方格只有线程3独自占有,线程3在第6个方格执行进队push操作。线程4、线程2也按上述方法分别在如图2所示的消息队列中第7个方格、第8个方格执行进队push操作。
[0192]参照图3,示出了本发明一种基于消息队列的线程间通信的方法实施例2的步骤流程图,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,其中,所述多线程进队push的操作具体可以包括:
[0193]步骤301,判断所述消息队列是否已满;
[0194]步骤302,若否,则分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0195]步骤303,依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置Pos ;
[0196]步骤304,所述η个线程分别在其进队push的实际位置Pos执行进队push操作;
[0197]步骤305,读取可读计数参数CanReadCount的值;
[0198]步骤306,按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值。
[0199]其中,所述单线程出队pop的操作可以为:
[0200]单个线程依次在所述消息队列中执行出队pop操作。
[0201]本实施例与上述方法实施例1的区别之处在于,本实施例增加了读取可读计数参数CanReadCount的值,按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值。
[0202]通过迭代增加可读计数参数CanReadCount,保证了线程执行读操作时可读原子数目的准确性,从而保证了线程间通信成功,减少资源消耗,充分利用系统资源,提高处理速度,从而提高服务器吞吐量。
[0203]参照图4,示出了本发明一种基于消息队列的线程间通信的方法实施例3的步骤流程图,采用所述消息队列执行单线程进队push以及多线程出队pop的操作,其中,所述多线程出队pop的操作具体可以包括:
[0204]步骤501,判断所述消息队列是否已空;
[0205]在具体实现中,当消息队列为已空时,将禁止在消息队列中读取数据。
[0206]在本发明的一种优选实施例中,所述步骤501具体可以包括如下子步骤:
[0207]子步骤S401,读取可读计数参数CanReadCount的值;
[0208]子步骤S402,递减所述CanReadCount的值;
[0209]子步骤S403,若获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。
[0210]在具体应用中,多线程进队pop操作时,每一个线程分别读取对应的可读计数参数CanReadCount的值,采用原子操作递减CanReadCount的值,若获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。若所述消息队列已空,则禁止执行出队pop的操作。
[0211]通过判断消息队列已空时,禁止执行出队pop的操作,保证了读取数据时的安全性与准确性,从而保证多线程访问成功,解决了线程间通信时阻塞的问题,从而提高服务器
吞吐量。
[0212]当然,上述判断消息队列是否为已空的处理方法只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他判断消息队列是否为已空的处理方法,本发明实施例对此不加以限制。另外,除了上述判断消息队列是否为已空的处理方法外,本领域技术人员还可以根据实际需要采用其它判断消息队列是否为已空的处理方法,本发明实施例对此也不加以限制。
[0213]步骤502,若否,则分别计算η个线程出队pop的偏移量;所述η为大于或等于I的
正整数;
[0214]在实际应用中,η个线程出队pop操作时,每个线程都是采用原子操作递加的方式,计算出来η个线程出队pop的偏移量各不相同。
[0215]在本发明的一种优选实施例中,所述步骤502具体可以包括如下子步骤:
[0216]子步骤S501,读取出队pop的偏移量Poppos的值;
[0217]子步骤S502,针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的偏移量。
[0218]在具体实现中,一个线程读取出队pop的偏移量Poppos的值,采用当前偏移量Poppos的值执行迭代增加操作,获得该线程出队pop的偏移量,下一个线程读取迭代增加操作后的出队pop的偏移量Poppos的值,执行迭代增加操作,获得此线程出队pop的偏移量,按上述方法依次针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的偏移量。
[0219]当然,上述计算η个线程出队pop的偏移量的处理方法只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他计算η个线程出队pop的偏移量的处理方法,本发明实施例对此不加以限制。另外,除了上述计算η个线程出队pop的偏移量的处理方法外,本领域技术人员还可以根据实际需要采用其它计算η个线程出队pop的偏移量的处理方法,本发明实施例对此也不加以限制。
[0220]步骤503,依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0221]在具体实现中,为了保证读取数据不超出消息队列的范围,可以分别计算所述η个线程出队pop的实际位置。
[0222]在本发明的一种优选实施例中,所述步骤503具体可以包括如下子步骤:
[0223]子步骤S601,读取所述消息队列大小参数Size的值;
[0224]子步骤S602,采用所述Size的值对所述Poppos的值取模,获得对应的η个线程进队pop的实际位置Pos。
[0225]在实际应用中,Pos=Poppos%Size, η个线程出队pop的偏移量各不相同,因此,η个线程出队pop的实际位置Pos也各不相同。这个时候实际位置Pos只有当前线程独自占有。[0226]当然,上述计算η个线程出队pop的实际位置Pos的处理方法只是作为示例,在实施本发明实施例时,可以根据实际情况设置其他计算η个线程出队pop的实际位置Pos的处理方法,本发明实施例对此不加以限制。另外,除了上述计算η个线程出队pop的实际位置Pos的处理方法外,本领域技术人员还可以根据实际需要采用其它计算η个线程出队pop的实际位置Pos的处理方法,本发明实施例对此也不加以限制。
[0227]步骤504,所述η个线程分别在其出队pop的实际位置执行出队pop操作。
[0228]在具体应用中,计算出了 η个线程出队pop的实际位置Pos,就可以在其出队pop的实际位置Pos执行出队pop操作。
[0229]其中,所述单线程进队push的操作具体可以为:
[0230]单个线程依次在所述消息队列中执行进队push操作。
[0231]在实际应用中,出队pop操作与进队push操作可以同时进行,单个线程有序的写入数据到消息队列中。
[0232]为便于本领域技术人员更好地理解本发明,以下通过一个具体示例简单说明多线程出队pop的方法。
[0233]参照图5,示出了本发明一种多线程出队pop的示意图。如图5所示,Threadl、Thread2、Thread3分别是线程1、线程2、线程3,图示中消息队列的各个方格表示实际位置。
[0234]在具体应用中,线程1、线程2、线程3分别执行出队pop操作,线程2读取可读计数参数CanReadCount的值,采用原子操作递减CanReadCount的值,获得递减后的CanReadCount的值不为O,然后,读取出队pop的偏移量Poppos的值,采用偏移量Poppos的值执行迭代增加操作,获得该线程出队pop的偏移量,之后,读取消息队列大小参数Size的值,采用Size的值对Poppos的值取模,得到实际位置,如图5所示的消息队列中第I个方格,此时,第I个方格只有线程2独自占有,线程2在第I个方格执行出队pop操作。线程I读取线程2递减后的可读计数参数CanReadCount的值,在其基础之上执行递减CanReadCount的值的操作,获得递减后的CanReadCount的值也不为0,然后,读取线程2出队pop的偏移量,在其基础之上执行迭代增加Poppos的值的操作,采用Size的值对Poppos的值取模,得到实际位置,如图5所示的消息队列中第2个方格,此时,第2个方格只有线程I独自占有,线程I在第2个方格执行出队pop操作。线程3也按上述方法在如图5所示的消息队列中第3个方格执行出队pop操作。
[0235]通过采用消息队列执行单线程进队push以及多线程出队pop的操作,利用原子操作计算多线程出队pop的偏移量,避免了多线程出队pop对应的偏移量互相重复,从而计算出多线程出队pop不同的实际位置,保证了多线程访问操作不碰撞,利用单个线程依次有序执行进队push操作,解决了线程间通信时阻塞的问题,减少了资源消耗,充分利用了系统资源,提高了处理速度,从而提高了服务器吞吐量。
[0236]参照图6,示出了本发明一种基于消息队列的线程间通信的方法实施例4的步骤流程图,采用所述消息队列执行单线程进队push以及多线程出队pop的操作,其中,所述多线程出队pop的操作具体可以包括:
[0237]步骤701,判断所述消息队列是否已空;
[0238]步骤702,若否,则分别计算η个线程出队pop的偏移量;所述η为大于或等于I的
正整数;[0239]步骤703,依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0240]步骤704,所述η个线程分别在其出队pop的实际位置执行出队pop操作。
[0241]步骤705,读取可写计数参数CanWriteCount的值;
[0242]步骤706,按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0243]其中,所述单线程进队push的操作可以为:
[0244]单个线程依次在所述消息队列中执行进队push操作。
[0245]本实施例与上述方法实施例3的区别之处在于,本实施例增加了读取可写计数参数CanWriteCount的值,按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0246]通过迭代增加可写计数参数CanWriteCount,保证了线程执行写操作时可写原子数目的准确性,从而保证了线程间通信成功,减少资源消耗,充分利用系统资源,提高处理速度,从而提高服务器吞吐量。
[0247]参照图7,示出了本发明一种基于消息队列的线程间通信的方法实施例5的步骤流程图,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,或者,采用所述消息队列执行单线程进队push以及多线程出队pop的操作。
[0248]其中,所述多线程进队push的操作包括:
[0249]步骤901,读取可写计数参数CanWriteCount的值;
[0250]步骤902,递减所述CanWriteCount的值;
[0251]步骤903,若获得递减后的CanWriteCount的值不为0,则判定所述消息队列为未满;
[0252]步骤904,在所述消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0253]步骤905,依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置;
[0254]步骤906,所述η个线程分别在其进队push的实际位置执行进队push操作;
[0255]步骤907,读取可读计数参数CanReadCount的值;
[0256]步骤908,按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值;
[0257]其中,所述多线程出队pop的操作包括:
[0258]读取可读计数参数CanReadCount的值;
[0259]递减所述CanReadCount 的值;
[0260]若获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空;
[0261 ] 在所述消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0262]依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0263]所述η个线程分别在其出队pop的实际位置执行出队pop操作;
[0264]读取可写计数参数CanWriteCount的值;
[0265]按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。[0266]在实际应用中,采用可写计数参数CanWriteCount和可读计数参数CanReadCount两个指针独立进行原子操作递加或递减,计算出不同的偏移量,从而控制实现无锁进行线程间通信。
[0267]需要说明的是,对于方法实施例,为了简单描述,故将其都表述为一系列的动作组合,但是本领域技术人员应该知悉,本发明并不受所描述的动作顺序的限制,因为依据本发明,某些步骤可以采用其他顺序或者同时进行。其次,本领域技术人员也应该知悉,说明书中所描述的实施例均属于优选实施例,所涉及的动作和模块并不一定是本发明所必须的。
[0268]参照图8,示出了本发明一种基于消息队列的线程间通信的系统实施例1的结构框图,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,其中,所述多线程进队push模块具体可以包括:
[0269]第一判断子模块1101,用于判断所述消息队列是否已满;
[0270]进队push偏移量计算子模块1102,用于在消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0271]进队push的实际位置Pos计算子模块1103,用于依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置Pos ;
[0272]操作进队push子模块1104,用于所述η个线程分别在其进队push的实际位置Pos执行进队push操作。
[0273]在本发明的一种优选实施例中,所述第一判断子模块具体可以包括:
[0274]可写计数参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0275]可写计数参数递减子模块,用于递减所述CanWriteCount的值;
[0276]第一判断子模块,用于在获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
[0277]在本发明的一种优选实施例中,所述进队push偏移量计算子模块具体可以包括:
[0278]偏移量Pushpos读取子模块,用于读取进队push的偏移量Pushpos的值;
[0279]偏移量Pushpos获得子模块,用于针对所述η个线程迭代增加所述Pushpos的值,分别获得所述η个线程进队push的偏移量。
[0280]在本发明的一种优选实施例中,所述进队push的实际位置Pos计算子模块具体可以包括:
[0281]第一大小参数Size读取子模块,用于读取所述消息队列大小参数Size的值;
[0282]进队push的实际位置Pos获得子模块,用于采用所述Size的值对所述Pushpos的值取模,获得对应的η个线程进队push的实际位置Pos。
[0283]在本发明的一种优选实施例中,所述多线程进队push模块还可以包括:
[0284]可读计数参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0285]可读计数参数读迭代增加子模块,用于按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值。
[0286]在本发明的一种优选实施例中,所述单线程出队pop模块可以包括:
[0287]出队pop子模块,用于单个线程依次在所述消息队列中执行出队pop操作。
[0288]在本发明的一种优选实施例中,所述多线程进队push模块还可以包括:
[0289]进队push的操作禁止子模块,用于在所述消息队列已满时,禁止执行进队push的操作。
[0290]对于图8所示的系统实施例而言,由于其与图3所示的方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0291]参照图9,示出了本发明一种基于消息队列的线程间通信的系统实施例2的结构框图,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块,其中,所述多线程出队pop模块具体可以包括:
[0292]第二判断子模块1201,用于判断所述消息队列是否已空;
[0293]出队pop的偏移量计算子模块1202,用于在消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0294]出队pop的实际位置Pos计算子模块1203,用于依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置Pos ;
[0295]操作出队pop子模块1204,用于所述η个线程分别在其出队pop的实际位置执行出队pop操作。
[0296]在本发明的一种优选实施例中,所述第二判断子模块可以包括:
[0297]可读计数参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0298]可读计数参数递减子模块,用于递减所述CanReadCount的值;
[0299]第二判断子模块,用于在获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。
[0300]在本发明的一种优选实施例中,所述出队pop的偏移量计算子模块具体可以包括:
[0301]偏移量Poppos读取子模块,用于读取出队pop的偏移量Poppos的值;
[0302]偏移量Poppos获得子模块,用于针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的偏移量。
[0303]在本发明的一种优选实施例中,所述出队pop的实际位置Pos计算子模块可以包括:
[0304]第二大小参数读取子模块,用于读取所述消息队列大小参数Size的值;
[0305]出队pop的实际位置Pos计算子模块,用于采用所述Size的值对所述Poppos的值取模,获得对应的η个线程出队pop的实际位置Pos。
[0306]在本发明的一种优选实施例中,所述多线程出队pop模块还可以包括:
[0307]可写计数参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0308]可写计数参数迭代增加子模块,用于按照所述η个线程出队pop的操作,迭代增加所述 CanWriteCount 的值。
[0309]在本发明的一种优选实施例中,所述单线程进队push模块可以包括:
[0310]进队push子模块,用于单个线程依次在所述消息队列中执行进队push操作。
[0311]在本发明的一种优选实施例中,所述多线程出队pop模块还包括:
[0312]出队pop的操作禁止子模块,用于在所述消息队列已空时,则禁止执行出队pop的操作。
[0313]对于图9所示的系统实施例而言,由于其与图6所示的方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。[0314]参照图10,示出了本发明一种基于消息队列的线程间通信的系统实施例3的结构框图,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,或者,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块;
[0315]其中,所述多线程进队push模块包括:
[0316]CanffriteCount参数读取子模块1301,用于读取可写计数参数CanWriteCount的值;
[0317]CanffriteCount参数递减子模块1302,用于递减所述CanWriteCount的值;
[0318]第一判定子模块1303,用于在获得递减后的CanWriteCount的值不为O,则判定所述消息队列为未满;
[0319]push的偏移量计算子模块1304,用于在所述消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0320]push的实际位置计算子模块1305,用于依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置;
[0321]push操作执行子模块1306,用于所述η个线程分别在其进队push的实际位置执行进队push操作;
[0322]CanReadCount参数读取子模块1307,用于读取可读计数参数CanReadCount的值;
[0323]CanReadCount参数迭加子模块1308,用于按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值;
[0324]其中,所述多线程出队pop模块包括:
[0325]CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0326]CanReadCount参数递减子模块,用于递减所述CanReadCount的值;
[0327]第二判定子模块,用于在获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空;
[0328]pop的偏移量计算子模块,用于在所述消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0329]pop的实际位置计算子模块,用于依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0330]pop操作执行子模块,用于所述η个线程分别在其出队pop的实际位置执行出队pop操作;
[0331]CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0332]CanffriteCount参数迭加子模块,用于按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0333]对于图10所示的系统实施例而言,由于其与图7所示的方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
[0334]在此提供的算法和显示不与任何特定计算机、虚拟系统或者其它设备固有相关。各种通用系统也可以与基于在此的示教一起使用。根据上面的描述,构造这类系统所要求的结构是显而易见的。此外,本发明也不针对任何特定编程语言。应当明白,可以利用各种编程语言实现在此描述的本发明的内容,并且上面对特定语言所做的描述是为了披露本发明的最佳实施方式。
[0335]在此处所提供的说明书中,说明了大量具体细节。然而,能够理解,本发明的实施例可以在没有这些具体细节的情况下实践。在一些实例中,并未详细示出公知的方法、结构和技术,以便不模糊对本说明书的理解。
[0336]类似地,应当理解,为了精简本公开并帮助理解各个发明方面中的一个或多个,在上面对本发明的示例性实施例的描述中,本发明的各个特征有时被一起分组到单个实施例、图、或者对其的描述中。然而,并不应将该公开的方法解释成反映如下意图:即所要求保护的本发明要求比在每个权利要求中所明确记载的特征更多的特征。更确切地说,如下面的权利要求书所反映的那样,发明方面在于少于前面公开的单个实施例的所有特征。因此,遵循【具体实施方式】的权利要求书由此明确地并入该【具体实施方式】,其中每个权利要求本身都作为本发明的单独实施例。
[0337]本领域那些技术人员可以理解,可以对实施例中的设备中的模块进行自适应性地改变并且把它们设置在与该实施例不同的一个或多个设备中。可以把实施例中的模块或单元或组件组合成一个模块或单元或组件,以及此外可以把它们分成多个子模块或子单元或子组件。除了这样的特征和/或过程或者单元中的至少一些是相互排斥之外,可以采用任何组合对本说明书(包括伴随的权利要求、摘要和附图)中公开的所有特征以及如此公开的任何方法或者设备的所有过程或单元进行组合。除非另外明确陈述,本说明书(包括伴随的权利要求、摘要和附图)中公开的每个特征可以由提供相同、等同或相似目的的替代特征来代替。
[0338]此外,本领域的技术人员能够理解,尽管在此所述的一些实施例包括其它实施例中所包括的某些特征而不是其它特征,但是不同实施例的特征的组合意味着处于本发明的范围之内并且形成不同的实施例。例如,在下面的权利要求书中,所要求保护的实施例的任意之一都可以以任意的组合方式来使用。
[0339]本发明的各个部件实施例可以以硬件实现,或者以在一个或者多个处理器上运行的软件模块实现,或者以它们的组合实现。本领域的技术人员应当理解,可以在实践中使用微处理器或者数字信号处理器(DSP)来实现根据本发明实施例的基于消息队列的线程间通信的方法和系统设备中的一些或者全部部件的一些或者全部功能。本发明还可以实现为用于执行这里所描述的方法的一部分或者全部的设备或者装置程序(例如,计算机程序和计算机程序产品)。这样的实现本发明的程序可以存储在计算机可读介质上,或者可以具有一个或者多个信号的形式。这样的信号可以从因特网网站上下载得到,或者在载体信号上提供,或者以任何其他形式提供。
[0340]应该注意的是上述实施例对本发明进行说明而不是对本发明进行限制,并且本领域技术人员在不脱离所附权利要求的范围的情况下可设计出替换实施例。在权利要求中,不应将位于括号之间的任何参考符号构造成对权利要求的限制。单词“包含”不排除存在未列在权利要求中的元件或步骤。位于元件之前的单词“一”或“一个”不排除存在多个这样的元件。本发明可以借助于包括有若干不同元件的硬件以及借助于适当编程的计算机来实现。在列举了若干装置的单元权利要求中,这些装置中的若干个可以是通过同一个硬件项来具体体现。单词第一、第二、以及第三等的使用不表示任何顺序。可将这些单词解释为名称。[0341]Al、一种基于消息队列的线程间通信的方法,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,其中,所述多线程进队push的操作包括:
[0342]判断所述消息队列是否已满;
[0343]若否,则分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0344]依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置Pos ;
[0345]所述η个线程分别在其进队push的实际位置Pos执行进队push操作。
[0346]A2、根据权利要求Al所述的方法,其特征在于,所述判断消息队列是否已满的步骤包括:
[0347]读取可写计数参数CanWriteCount的值;
[0348]递减所述CanWriteCount 的值;
[0349]若获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
[0350]A3、根据权利要求Al所述的方法,其特征在于,所述分别计算η个线程进队push的偏移量的步骤包括:
[0351]读取进队push的偏移量Pushpos的值;
[0352]针对所述η个线程迭代增加所述Pushpos的值,分别获得所述η个线程进队push
的偏移量。
[0353]A4、根据权利要求Al所述的方法,其特征在于,所述分别计算所述η个线程进队push的实际位置Pos的步骤包括:
[0354]读取所述消息队列大小参数Size的值;
[0355]采用所述Size的值对所述Pushpos的值取模,获得对应的η个线程进队push的实际位置Pos。
[0356]A5、根据权利要求Al或A2或A3或A4所述的方法,其特征在于,在所述η个线程分别在其进队push的实际位置执行进队push操作的步骤之后,还包括:
[0357]读取可读计数参数CanReadCount的值;
[0358]按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值。
[0359]A6、根据权利要求Al所述的方法,其特征在于,所述单线程出队pop的操作的步骤为:
[0360]单个线程依次在所述消息队列中执行出队pop操作。
[0361]A7、根据权利要求Al所述的方法,其特征在于,还包括:
[0362]若所述消息队列已满,则禁止执行进队push的操作。
[0363]B8、一种基于消息队列的线程间通信的方法,采用所述消息队列执行单线程进队push以及多线程出队pop的操作,其中,所述多线程出队pop的操作包括:
[0364]判断所述消息队列是否已空;
[0365]若否,则分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0366]依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置 Pos ;
[0367]所述η个线程分别在其出队pop的实际位置执行出队pop操作。[0368]B9、根据权利要求B8所述的方法,其特征在于,所述判断消息队列是否已空的步骤包括:
[0369]读取可读计数参数CanReadCount的值;
[0370]递减所述CanReadCount 的值;
[0371]若获得递减后的CanReadCount的值为O,则判定所述消息队列为已空,否则,判定所述消息队列为未空。
[0372]B10、根据权利要求B8所述的方法,其特征在于,所述分别计算η个线程出队pop的偏移量的步骤还包括:
[0373]读取出队pop的偏移量Poppos的值;
[0374]针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的
偏移量。
[0375]B11、根据权利要求B8所述的方法,其特征在于,所述分别计算所述η个线程出队pop的实际位置Pos的步骤还包括:
[0376]读取所述消息队列大小参数Size的值;
[0377]采用所述Size的值对所述Poppos的值取模,获得对应的η个线程出队pop的实际位置Pos。
[0378]B12、根据权利要求B8或B9或BlO或Bll所述的方法,其特征在于,在所述η个线程分别在其出队pop的实际位置执行出队pop操作的步骤之后,还包括:
[0379]读取可写计数参数CanWriteCount的值;
[0380]按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0381]B13、根据权利要求B8所述的方法,其特征在于,所述单线程进队push的操作包括:
[0382]单个线程依次在所述消息队列中执行进队push操作。
[0383]B14、根据权利要求B8所述的方法,其特征在于,还包括:
[0384]若所述消息队列已空,则禁止执行出队pop的操作。
[0385]C15、一种基于消息队列的线程间通信的方法,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,或者,采用所述消息队列执行单线程进队push以及多线程出队pop的操作;
[0386]其中,所述多线程进队push的操作包括:
[0387]读取可写计数参数CanWriteCount的值;
[0388]递减所述CanWriteCount 的值;
[0389]若获得递减后的CanWriteCount的值不为O,则判定所述消息队列为未满;
[0390]在所述消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0391]依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际
位置;
[0392]所述η个线程分别在其进队push的实际位置执行进队push操作;
[0393]读取可读计数参数CanReadCount的值;
[0394]按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值;[0395]其中,所述多线程出队pop的操作包括:
[0396]读取可读计数参数CanReadCount的值;
[0397]递减所述CanReadCount 的值;
[0398]若获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空;
[0399]在所述消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0400]依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0401]所述η个线程分别在其出队pop的实际位置执行出队pop操作;
[0402]读取可写计数参数CanWriteCount的值;
[0403]按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
[0404]D16、一种基于消息队列的线程间通信的系统,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,其中,所述多线程进队push模块包括:
[0405]第一判断子模块,用于判断所述消息队列是否已满;
[0406]进队push偏移量计算子模块,用于在消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0407]进队push的实际位置Pos计算子模块,用于依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置Pos ;
[0408]操作进队push子模块,用于所述η个线程分别在其进队push的实际位置Pos执行进队push操作。
[0409]D17、根据权利要求D16所述的系统,其特征在于,所述第一判断子模块包括:
[0410]可写计数参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0411]可写计数参数递减子模块,用于递减所述CanWriteCount的值;
[0412]第一判断子模块,用于在获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
[0413]D18、根据权利要求D16所述的系统,其特征在于,所述进队push偏移量计算子模块包括:
[0414]偏移量Pushpos读取子模块,用于读取进队push的偏移量Pushpos的值;
[0415]偏移量Pushpos获得子模块,用于针对所述η个线程迭代增加所述Pushpos的值,分别获得所述η个线程进队push的偏移量。
[0416]D19、根据权利要求D16所述的系统,其特征在于,所述进队push的实际位置Pos计算子模块包括:
[0417]第一大小参数Size读取子模块,用于读取所述消息队列大小参数Size的值;
[0418]进队push的实际位置Pos获得子模块,用于获得对应的η个线程进队push的实际位置Pos。
[0419]D20、根据权利要求D16或D17或D18或D19所述的系统,所述多线程进队push子模块还包括:
[0420]可读计数参数读取子模块,读取可读计数参数CanReadCount的值;
[0421]可读计数参数读迭代增加子模块,按照所述η个线程进队push的操作,迭代增加所述 CanReadCount 的值。
[0422]D21、根据权利要求D16所述的系统,其特征在于,所述单线程出队pop模块包括:
[0423]出队pop子模块,用于单个线程依次在所述消息队列中执行出队pop操作。
[0424]D22、根据权利要求D16所述的系统,其特征在于,还包括:
[0425]进队push的操作禁止子模块,用于在所述消息队列已满时,禁止执行进队push的操作。
[0426]E23、一种基于消息队列的线程间通信的系统,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块,其中,所述多线程出队pop模块包括:
[0427]第二判断子模块,用于判断所述消息队列是否已空;
[0428]出队pop的偏移量计算子模块,用于在消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0429]出队pop的实际位置Pos计算子模块,用于依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置Pos ;
[0430]操作出队pop子模块,用于所述η个线程分别在其出队pop的实际位置执行出队pop操作。
[0431]E24、根据权利要求E23所述的系统,其特征在于,所述第二判断子模块包括:
[0432]可读计数参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0433]可读计数参数递减子模块,用于递减所述CanReadCount的值;
[0434]第二判断子模块,用于在获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。
[0435]E25、根据权利要求E23所述的系统,其特征在于,所述出队pop的偏移量计算子模块还包括:
[0436]偏移量Poppos读取子模块,用于读取出队pop的偏移量Poppos的值;
[0437]偏移量Poppos获得子模块,用于针对所述η个线程迭代增加所述Poppos的值,分别获得所述η个线程出队pop的偏移量。
[0438]E26、根据权利要求E23所述的系统,其特征在于,所述出队pop的实际位置Pos计算子模块包括:
[0439]第二大小参数读取子模块,用于读取所述消息队列大小参数Size的值;
[0440]出队pop的实际位置Pos计算子模块,用于采用所述Size的值对所述Poppos的值取模,获得对应的η个线程出队pop的实际位置Pos。
[0441]E27、根据权利要求E23或E24或E25或E26所述的系统,所述多线程出队pop模块还包括:
[0442]可写计数参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0443]可写计数参数迭代增加子模块,用于按照所述η个线程出队pop的操作,迭代增加所述 CanWriteCount 的值。
[0444]E28、根据权利要求E23所述的系统,其特征在于,所述单线程进队push模块包括:
[0445]进队push子模块,用于单个线程依次在所述消息队列中执行进队push操作。
[0446]E29、根据权利要求E23所述的系统,其特征在于,还包括:[0447]出队pop的操作禁止子模块,用于在所述消息队列已空时,则禁止执行出队pop的操作。
[0448]F30、一种基于消息队列的线程间通信的系统,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,或者,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块;
[0449]其中,所述多线程进队push模块包括:
[0450]CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0451]CanffriteCount参数递减子模块,用于递减所述CanWriteCount的值;
[0452]第三判断子模块,用于在获得递减后的CanWriteCount的值不为0,则判定所述消息队列为未满;
[0453]push的偏移量计算子模块,用于在所述消息队列未满时,分别计算η个线程进队push的偏移量;所述η为大于或等于I的正整数;
[0454]push的实际位置计算子模块,用于依据所述η个线程进队push的偏移量,分别计算所述η个线程进队push的实际位置;
[0455]push操作执行子模块,用于所述η个线程分别在其进队push的实际位置执行进队push操作;
[0456]CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0457]CanReadCount参数迭加子模块,用于按照所述η个线程进队push的操作,迭代增加所述CanReadCount的值;
[0458]其中,所述多线程出队pop模块包括:
[0459]CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值;
[0460]CanReadCount参数递减子模块,用于递减所述CanReadCount的值;
[0461]第四判断子模块,用于在获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空;
[0462]pop的偏移量计算子模块,用于在所述消息队列未空时,分别计算η个线程出队pop的偏移量;所述η为大于或等于I的正整数;
[0463]pop的实际位置计算子模块,用于依据所述η个线程出队pop的偏移量,分别计算所述η个线程出队pop的实际位置;
[0464]pop操作执行子模块,用于所述η个线程分别在其出队pop的实际位置执行出队pop操作;
[0465]CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;
[0466]CanffriteCount参数迭加子模块,用于按照所述η个线程出队pop的操作,迭代增加所述CanWriteCount的值。
【权利要求】
1.一种基于消息队列的线程间通信的方法,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,其中,所述多线程进队push的操作包括: 判断所述消息队列是否已满; 若否,则分别计算n个线程进队push的偏移量;所述n为大于或等于I的正整数; 依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置Pos ; 所述n个线程分别在其进队push的实际位置Pos执行进队push操作。
2.根据权利要求1所述的方法,其特征在于,所述判断消息队列是否已满的步骤包括: 读取可写计数参数CanWriteCount的值; 递减所述CanWriteCount的值; 若获得递减后的CanWriteCount的值为0,则判定所述消息队列为已满,否则,判定所述消息队列为未满。
3.根据权利要求1或2所述的方法,其特征在于,在所述n个线程分别在其进队push的实际位置执行进队push操作的步骤之后,还包括: 读取可读计数参数CanReadCount的值; 按照所述n个线程进队push的操作,迭代增加所述CanReadCount的值。
4.一种基于消息队列的线程间通信的方法,采用所述消息队列执行单线程进队push以及多线程出队pop的操作,其中,所述多线程出队pop的操作包括: 判断所述消息队列是否已空; 若否,则分别计算n个线程出队pop的偏移量;所述n为大于或等于I的正整数; 依据所述n个线程出队pop的偏移量,分别计算所述n个线程出队pop的实际位置Pos ; 所述n个线程分别在其出队pop的实际位置执行出队pop操作。
5.根据权利要求4所述的方法,其特征在于,所述判断消息队列是否已空的步骤包括: 读取可读计数参数CanReadCount的值; 递减所述CanReadCount的值; 若获得递减后的CanReadCount的值为0,则判定所述消息队列为已空,否则,判定所述消息队列为未空。
6.根据权利要求4或5所述的方法,其特征在于,在所述n个线程分别在其出队pop的实际位置执行出队pop操作的步骤之后,还包括: 读取可写计数参数CanWriteCount的值; 按照所述n个线程出队pop的操作,迭代增加所述CanWriteCount的值。
7.一种基于消息队列的线程间通信的方法,采用所述消息队列执行多线程进队push以及单线程出队pop的操作,或者,采用所述消息队列执行单线程进队push以及多线程出队pop的操作; 其中,所述多线程进队push的操作包括: 读取可写计数参数CanWriteCount的值; 递减所述CanWriteCount的值; 若获得递减后的CanWriteCount的值不为0,则判定所述消息队列为未满;在所述消息队列未满时,分别计算n个线程进队push的偏移量;所述n为大于或等于I的正整数; 依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置; 所述n个线程分别在其进队push的实际位置执行进队push操作; 读取可读计数参数CanReadCount的值; 按照所述n个线程进队push的操作,迭代增加所述CanReadCount的值; 其中,所述多线程出队pop的操作包括: 读取可读计数参数CanReadCount的值; 递减所述CanReadCount的值; 若获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空; 在所述消息队列未空时,分别计算n个线程出队pop的偏移量;所述n为大于或等于I的正整数; 依据所述n个线程出队pop的偏移量,分别计算所述n个线程出队pop的实际位置; 所述n个线程分别在其出队pop的实际位置执行出队pop操作; 读取可写计数参数CanWriteCount的值; 按照所述n个线程出队pop的操作,迭代增加所述CanWriteCount的值。
8.一种基于消息队列的线程间通信的系统,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,其`中,所述多线程进队push模块包括: 第一判断子模块,用于判断所述消息队列是否已满; 进队push偏移量计算子模块,用于在消息队列未满时,分别计算n个线程进队push的偏移量;所述n为大于或等于I的正整数; 进队push的实际位置Pos计算子模块,用于依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置Pos ; 操作进队push子模块,用于所述n个线程分别在其进队push的实际位置Pos执行进队push操作。
9.一种基于消息队列的线程间通信的系统,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块,其中,所述多线程出队pop模块包括: 第二判断子模块,用于判断所述消息队列是否已空; 出队pop的偏移量计算子模块,用于在消息队列未空时,分别计算n个线程出队pop的偏移量;所述n为大于或等于I的正整数; 出队pop的实际位置Pos计算子模块,用于依据所述n个线程出队pop的偏移量,分别计算所述n个线程出队pop的实际位置Pos ; 操作出队pop子模块,用于所述n个线程分别在其出队pop的实际位置执行出队pop操作。
10.一种基于消息队列的线程间通信的系统,采用所述消息队列执行多线程进队push模块以及单线程出队pop模块,或者,采用所述消息队列执行单线程进队push模块以及多线程出队pop模块; 其中,所述多线程进队push模块包括: CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;CanffriteCount参数递减子模块,用于递减所述CanWriteCount的值; 第三判断子模块,用于在获得递减后的CanWriteCount的值不为0,则判定所述消息队列为未满; push的偏移量计算子模块,用于在所述消息队列未满时,分别计算n个线程进队push的偏移量;所述n为大于或等于I的正整数; push的实际位置计算子模块,用于依据所述n个线程进队push的偏移量,分别计算所述n个线程进队push的实际位置; push操作执行子模块,用于所述n个线程分别在其进队push的实际位置执行进队push操作; CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值;CanReadCount参数迭加子模块,用于按照所述n个线程进队push的操作,迭代增加所述 CanReadCount 的值; 其中,所述多线程出队pop模块包括: CanReadCount参数读取子模块,用于读取可读计数参数CanReadCount的值; CanReadCount参数递减子模块,用于递减所述CanReadCount的值; 第四判断子模块,用于在获得递减后的CanReadCount的值不为0,则判定所述消息队列为未空; pop的偏移量计算子模块,用于在所述消息队列未空时,分别计算n个线程出队pop的偏移量;所述n为大于或等于 I的正整数; pop的实际位置计算子模块,用于依据所述n个线程出队pop的偏移量,分别计算所述n个线程出队pop的实际位置; pop操作执行子模块,用于所述n个线程分别在其出队pop的实际位置执行出队pop操作; CanffriteCount参数读取子模块,用于读取可写计数参数CanWriteCount的值;CanffriteCount参数迭加子模块,用于按照所述n个线程出队pop的操作,迭代增加所述 CanWriteCount 的值。
【文档编号】G06F9/54GK103631665SQ201310683403
【公开日】2014年3月12日 申请日期:2013年12月12日 优先权日:2013年12月12日
【发明者】蔡东赟, 王东玉 申请人:北京奇虎科技有限公司, 奇智软件(北京)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1