本发明涉及计算机软件技术领域,特别涉及一种适用于多生产者多消费者模式的数据管理方法及系统。
背景技术:
目前,在传统软件技术的多生产者多消费者模式下,为了保证数据的正确性,需要引入互斥锁,否则将会导致多线程同时访问队列数据而引起线程同时进入互斥区等问题。
然而,在多生产者多消费者模式的实现过程中,互斥锁的引入,将会导致在队列访问负载较大的情况下造成CPU效率低下甚至引发程序的死锁等问题。
综上所述可以看出,如何在实现多生产者多消费者模式的过程中,保证软件程序的稳定性和执行效率是目前有待解决的问题。
技术实现要素:
有鉴于此,本发明的目的在于提供一种适用于多生产者多消费者模式的数据管理方法及系统,能够在实现多生产者多消费者模式的过程中,保证了软件程序的稳定性和执行效率。其具体方案如下:
一种适用于多生产者多消费者模式的数据管理方法,包括:
当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设队列当前是否符合入列条件,如果是,则将该新数据元素缓存至所述预设队列,如果否,则禁止将该新数据元素缓存至所述预设队列;
当多个消费者中的任一消费者需要对所述预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断所述预设队列当前是否符合出列条件,如果是,则从当前所述预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
可选的,所述判断预设队列当前是否符合入列条件的过程,包括:
判断所述预设队列当前是否已经存满,如果否,则判定当前所述预设队列符合入列条件,如果是,则判定当前所述预设队列不符合入列条件。
可选的,所述判断所述预设队列当前是否符合出列条件的过程,包括:
判断当前所述预设队列中是否存在未处理的数据元素,如果是,则判定当前所述预设队列符合出列条件,如果否,则判定当前所述预设队列不符合出列条件。
可选的,所述方法,还包括:
对所述预设队列进行实时监视;
若监视到当前所述预设队列中的剩余缓存空间容量小于预设容量阈值,则发出相应的容量预警信息。
可选的,所述预设队列为环形缓冲区。
本发明还相应公开了一种适用于多生产者多消费者模式的数据管理系统,包括:
入列管理模块,用于当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设队列当前是否符合入列条件,如果是,则将该新数据元素缓存至所述预设队列,如果否,则禁止将该新数据元素缓存至所述预设队列;
出列管理模块,用于当多个消费者中的任一消费者需要对所述预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断所述预设队列当前是否符合出列条件,如果是,则从当前所述预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
可选的,所述入列管理模块,包括:
第一判断单元,用于当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断所述预设队列当前是否已经存满,如果否,则判定当前所述预设队列符合入列条件,如果是,则判定当前所述预设队列不符合入列条件;
入列控制单元,用于当所述第一判断单元判定当前所述预设队列符合入列条件,则将该新数据元素缓存至所述预设队列,当所述第一判断单元判定当前所述预设队列不符合入列条件,则禁止将该新数据元素缓存至所述预设队列。
可选的,所述出列管理模块,包括:
第二判断单元,用于当多个消费者中的任一消费者需要对所述预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断当前所述预设队列中是否存在未处理的数据元素,如果是,则判定当前所述预设队列符合出列条件,如果否,则判定当前所述预设队列不符合出列条件;
出列管理单元,用于当所述第二判断单元判定当前所述预设队列符合出列条件,则从当前所述预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
可选的,所述数据管理系统,还包括:
队列监视模块,用于对所述预设队列进行实时监视;
容量预警模块,用于当所述队列监视模块监视到当前所述预设队列中的剩余缓存空间容量小于预设容量阈值,则发出相应的容量预警信息。
可选的,所述预设队列为环形缓冲区。
本发明中,适用于多生产者多消费者模式的数据管理方法,包括:当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设队列当前是否符合入列条件,如果是,则将该新数据元素缓存至预设队列,如果否,则禁止将该新数据元素缓存至预设队列;当多个消费者中的任一消费者需要对预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断预设队列当前是否符合出列条件,如果是,则从当前预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
可见,本发明在多生产者多消费者模式下,若任一生产者产生新数据元素,则会利用std::atomic类型来判断预设队列当前是否符合入列条件,然后根据该判断结果来决定是否允许将上新数据元素缓存至上述预设队列,若任一消费者试图对上述预设队列中缓存的数据元素进行处理,则会利用std::atomic类型来判断上述预设队列当前是否符合出列条件,如果是,则会从上述预设队列中提取出待处理数据,然后发送至相应的消费者以进行相应的数据处理。由于std::atomic类型对象能够在不同的线程访问中避免数据竞争事件的发生,从而使得上述基于std::atomic类型的数据访问过程能够稳定可靠地进行,并具有较高的执行效率。也即,本发明能够在实现多生产者多消费者模式的过程中,保证了软件程序的稳定性和执行效率。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本发明实施例公开的一种适用于多生产者多消费者模式的数据管理方法流程图;
图2为本发明实施例公开的一种适用于多生产者多消费者模式的数据入列管理方法流程图;
图3为本发明实施例公开的一种适用于多生产者多消费者模式的数据出列管理方法流程图;
图4为本发明实施例公开的一种适用于多生产者多消费者模式的数据管理系统结构示意图。
具体实施方式
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本发明实施例公开了一种适用于多生产者多消费者模式的数据管理方法,参见图1所示,该方法包括:
步骤S11:当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设队列当前是否符合入列条件,如果是,则将该新数据元素缓存至预设队列,如果否,则禁止将该新数据元素缓存至预设队列;
步骤S12:当多个消费者中的任一消费者需要对预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断预设队列当前是否符合出列条件,如果是,则从当前预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
可以理解的是,上述步骤S11和步骤S12之间在执行顺序上并无先后关系。
进一步的,本发明实施例的数据管理方法,还可以包括:对预设队列进行实时监视,若监视到当前预设队列中的剩余缓存空间容量小于预设容量阈值,则发出相应的容量预警信息。
其中,上述预设容量阈值可以由用户根据实际经验进行具体设定,在此不对其进行具体限定。
由上可见,本发明实施例在多生产者多消费者模式下,若任一生产者产生新数据元素,则会利用std::atomic类型来判断预设队列当前是否符合入列条件,然后根据该判断结果来决定是否允许将上新数据元素缓存至上述预设队列,若任一消费者试图对上述预设队列中缓存的数据元素进行处理,则会利用std::atomic类型来判断上述预设队列当前是否符合出列条件,如果是,则会从上述预设队列中提取出待处理数据,然后发送至相应的消费者以进行相应的数据处理。由于std::atomic类型对象能够在不同的线程访问中避免数据竞争事件的发生,从而使得上述基于std::atomic类型的数据访问过程能够稳定可靠地进行,并具有较高的执行效率。也即,本发明实施例能够在实现多生产者多消费者模式的过程中,保证了软件程序的稳定性和执行效率。
参见图2所示,本发明实施例公开了一种具体的适用于多生产者多消费者模式的数据入列管理方法,包括如下步骤:
步骤S21:当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设的环形缓冲区当前是否已经存满,如果否,则判定当前环形缓冲区符合入列条件,如果是,则判定当前环形缓冲区不符合入列条件。
步骤S22:若判定当前上述环形缓冲区符合入列条件,则将上述新数据元素缓存至上述环形缓冲区;
步骤S23:若判定当前上述环形缓冲区不符合入列条件,则禁止将上述新数据元素缓存至上述环形缓冲区。
需要说明的是,由于目前技术和硬件的限制,环形缓冲区不能无限的大,这就导致入队列时,当环形缓冲区溢出后,将会出现丢弃数据的情况。针对这种情况,在使用本发明方法时,需要协商一个合理的环形缓冲区长度,保证消费者和生产者之间平衡,数据不会丢失,并且合理的使用操作系统的内存。
在上一实施例的基础上,参见图3所示,本发明实施例公开了一种具体的适用于多生产者多消费者模式的数据出列管理方法,包括如下步骤:
步骤S31:当多个消费者中的任一消费者需要对上述环形缓冲区中缓存的数据元素进行处理,则利用std::atomic类型,判断当前预设队列中是否存在未处理的数据元素,如果是,则判定当前预设队列符合出列条件,如果否,则判定当前预设队列不符合出列条件。
步骤S32:若判定当前预设队列符合出列条件,则从当前预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
步骤S33:若判定当前预设队列不符合出列条件,则返回出列失败的提示信息。
相应的,本发明还公开了一种适用于多生产者多消费者模式的数据管理系统,参见图4所示,该系统包括:
入列管理模块11,用于当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设队列当前是否符合入列条件,如果是,则将该新数据元素缓存至预设队列,如果否,则禁止将该新数据元素缓存至预设队列;
出列管理模块12,用于当多个消费者中的任一消费者需要对预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断预设队列当前是否符合出列条件,如果是,则从当前预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
由上可见,本发明实施例在多生产者多消费者模式下,若任一生产者产生新数据元素,则会利用std::atomic类型来判断预设队列当前是否符合入列条件,然后根据该判断结果来决定是否允许将上新数据元素缓存至上述预设队列,若任一消费者试图对上述预设队列中缓存的数据元素进行处理,则会利用std::atomic类型来判断上述预设队列当前是否符合出列条件,如果是,则会从上述预设队列中提取出待处理数据,然后发送至相应的消费者以进行相应的数据处理。由于std::atomic类型对象能够在不同的线程访问中避免数据竞争事件的发生,从而使得上述基于std::atomic类型的数据访问过程能够稳定可靠地进行,并具有较高的执行效率。也即,本发明实施例能够在实现多生产者多消费者模式的过程中,保证了软件程序的稳定性和执行效率。
其中,上述入列管理模块,包括第一判断单元和入列控制单元;其中,
第一判断单元,用于当多个生产者中的任一生产者产生新数据元素,则利用std::atomic类型,判断预设队列当前是否已经存满,如果否,则判定当前预设队列符合入列条件,如果是,则判定当前预设队列不符合入列条件;
入列控制单元,用于当第一判断单元判定当前预设队列符合入列条件,则将该新数据元素缓存至预设队列,当第一判断单元判定当前预设队列不符合入列条件,则禁止将该新数据元素缓存至预设队列。
另外,上述出列管理模块,包括第二判断单元和出列管理单元;其中,
第二判断单元,用于当多个消费者中的任一消费者需要对预设队列中缓存的数据元素进行处理,则利用std::atomic类型,判断当前预设队列中是否存在未处理的数据元素,如果是,则判定当前预设队列符合出列条件,如果否,则判定当前预设队列不符合出列条件;
出列管理单元,用于当第二判断单元判定当前预设队列符合出列条件,则从当前预设队列中提取出相应的数据元素,并发送至相应的消费者,以进行相应的数据处理。
本实施例中,上述数据管理系统,还可以进一步包括队列监视模块和容量预警模块;其中,
队列监视模块,用于对预设队列进行实时监视;
容量预警模块,用于当队列监视模块监视到当前预设队列中的剩余缓存空间容量小于预设容量阈值,则发出相应的容量预警信息。
本实施例中,上述预设队列具体可以为环形缓冲区。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本发明所提供的一种适用于多生产者多消费者模式的数据管理方法及系统进行了详细介绍,本文中应用了具体个例对本发明的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本发明的方法及其核心思想;同时,对于本领域的一般技术人员,依据本发明的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本发明的限制。