多线程处理系统及方法
【专利摘要】本发明公开了一种多线程处理系统及方法,该系统包括一写线程、多个读线程以及一全局next指针,该写线程对一主链表进行写操作,该多个读线程均对该主链表进行读操作;当该写线程对该主链表中的一目标节点进行写操作时,该全局next指针指示该目标节点的下一个节点的地址;当该多个读线程中的至少一个读线程读取至该目标节点时,该至少一个读线程均读取该全局next指针指示的地址并对该目标节点的下一个节点进行读操作。本发明能够使得读线程越过正在进行写操作的节点而继续对下一节点进行读操作,从而避免了读线程在读取时需要等待释放锁才可以继续读取的缺陷,节约了时间,加快了读线程的读取速度,提供了工作效率。
【专利说明】多线程处理系统及方法
【技术领域】
[0001]本发明涉及一种多线程处理系统及方法,特别是涉及一种能够使得读线程越过正在进行写操作的节点而继续进行读操作的多线程处理系统以及一种利用该多线程处理系统实现的多线程处理方法。
【背景技术】
[0002]多线程共享链表是当前数据处理中比较热门的话题,即在该链表数据进行更新时仍有其它线程对该链表进行读操作。一般目前采用的主要处理方法是:在等到该链表更新完毕后才允许对该链表进行读操作,当一线程正在进行写操作时对整个链表进行加互斥锁,让其它线程等待,而对该链表中某一个节点进行写操作时也加互斥锁,让其它线程等待写操作完成之后,解锁并将该结点释放后再进行读操作。这样会导致当链表更新比较频繁时,写线程更新数据需要频繁加锁,而读线程只能等待解锁后才能进行读操作,造成读线程等待时间过长,严重降低了多线程处理的效率。
【发明内容】
[0003]本发明要解决的技术问题是为了克服现有技术中链表更新比较频繁时,写线程更新数据需要频繁加锁,而读线程只能等待解锁后才能进行读操作,造成读线程等待时间过长,严重降低了多线程处理的效率的缺陷,提供一种能够使得读线程越过正在进行写操作的节点而继续进行读操作的多线程处理系统以及一种利用该多线程处理系统实现的多线程处理方法。
[0004]本发明是通过下述技术方案来解决上述技术问题的:
[0005]本发明提供了一种多线程处理系统,其特点在于,其包括一写线程、多个读线程以及一全局next指针(能够指向下一个节点的地址的指针),该写线程用于对一主链表进行写操作,该多个读线程均用于对该主链表进行读操作;
[0006]当该写线程对该主链表中的一目标节点进行写操作时,该全局next指针用于指示该目标节点的下一个节点的地址;
[0007]当该多个读线程中的至少一个读线程读取至该目标节点时,该至少一个读线程均用于读取该全局next指针指示的地址处的节点。
[0008]对于该主链表,在同一时间段只能进行一个写操作,并且进行写操作的多个节点都是一个个按顺序依次进行的,而读操作则可以多个同时进行,这都属于本领域的公知技术,在此就不再赘述。
[0009]通过使得读取至该目标节点的该至少一个读线程均读取该全局next指针指示的地址并对该目标节点的下一个节点进行读操作,就避免了在读取至该目标节点时,因为该目标节点正在被写而导致该至少一个读线程都只能等待释放锁才可以继续读取的缺陷,节约了时间,加快了读线程的读取速度,提供了工作效率。
[0010]较佳地,该写线程对该主链表进行的写操作为一插入节点的操作、一修改节点的操作或一删除节点的操作,该主链表中的每个节点均包括一标志位,该写线程还用于在对该目标节点进行写操作时对该目标节点的标志位进行赋值,以表征该写操作为该插入节点的操作、该修改节点的操作或该删除节点的操作;
[0011]每个该读线程均具有一相匹配的副链表,该至少一个读线程还用于读取该目标节点的标志位的值,并在检测出该写操作为该插入节点的操作或该修改节点的操作时,分别将该目标节点的地址保存在与该至少一个读线程相匹配的副链表中,并在对该主链表中除该目标节点之外的节点的读操作完成之后分别读取与该至少一个读线程相匹配的副链表中保存的该目标节点的地址,以返回该主链表中读取该目标节点。
[0012]由于在该写线程对该主链表进行写操作时会添加互斥锁,使得其它读线程只有在解锁并释放节点后才能进行读操作。因此,若该至少一个读线程读取至该目标节点,并通过互斥锁检测出该目标节点正在被写时,该至少一个读线程会跳过该目标节点继续读取下一节点,并且,该至少一个读线程还能够读取该目标节点的标志位的值,从而对该写操作进行检测,并在检测出该写操作为该插入节点的操作或该修改节点的操作时,将该目标节点的地址保存在与该至少一个读线程相匹配的副链表中,而在读取完该主链表中的所有节点后,该至少一个读线程会分别读取相匹配的副链表中保存的该目标节点的地址,从而就能够返回该主链表中读取进行写操作后的该目标节点的内容。而如果该至少一个读线程读取该目标节点的标志位的值后检测出该写操作为该删除节点的操作,则该至少一个读线程只会跳过该目标节点继续读取下一节点,而不会再将该目标节点的地址保存在相匹配的副链表中。
[0013]较佳地,该目标节点的标志位有八位,当该八位中的第一位的值为I时,表征该写操作为该插入节点的操作,当该八位中的第二位的值为I时,表征该写操作为该修改节点的操作,当该八位中的第三位的值为I时,表征该写操作为该删除节点的操作。
[0014]若该写操作为该插入节点的操作,则该写线程将该目标节点的八位标志位的第一位赋值为1,若该写操作为该修改节点的操作,则该写线程将该第二位赋值为1,若该写操作为该删除节点的操作,则该写线程将该第三位赋值为I。
[0015]较佳地,该写线程的写操作的优先级高于该多个读线程的读操作。当该写线程与读线程准备对同一个节点进行操作时,该写线程的写操作优先级高于读线程的读操作,因此会首先对该节点进行写操作,在写操作完成之后才允许读线程进行读操作,从而保证了读线程读取的数据为写操作完成之后更新的数据。
[0016]本发明的目的在于还提供了一种多线程处理方法,其特点在于,其利用上述的多线程处理系统实现,该多线程处理方法为:该写线程对该主链表进行写操作同时该多个读线程均对该主链表进行读操作,并且当该写线程对该主链表中的一目标节点进行写操作时,该全局next指针指示该目标节点的下一个节点的地址,而当该至少一个读线程读取至该目标节点时,该至少一个读线程均读取该全局next指针指示的地址处的节点。
[0017]较佳地,该写线程对该主链表进行的写操作为一插入节点的操作、一修改节点的操作或一删除节点的操作,该主链表中的每个节点均包括一标志位,该写线程还在对该目标节点进行写操作时对该目标节点的标志位进行赋值,以表征该写操作为该插入节点的操作、该修改节点的操作或该删除节点的操作;
[0018]每个该读线程均具有一相匹配的副链表,该至少一个读线程还读取该目标节点的标志位的值,并在检测出该写操作为该插入节点的操作或该修改节点的操作时,分别将该目标节点的地址保存在与该至少一个读线程相匹配的副链表中,并在对该主链表中除该目标节点之外的节点的读操作完成之后分别读取与该至少一个读线程相匹配的副链表中保存的该目标节点的地址,以返回该主链表中读取该目标节点。
[0019]较佳地,该目标节点的标志位有八位,当该八位中的第一位的值为I时,表征该写操作为该插入节点的操作,当该八位中的第二位的值为I时,表征该写操作为该修改节点的操作,当该八位中的第三位的值为I时,表征该写操作为该删除节点的操作。
[0020]较佳地,该写线程的写操作的优先级高于该多个读线程的读操作。
[0021]本发明的积极进步效果在于:本发明能够使得读线程越过正在进行写操作的节点而继续对下一节点进行读操作,从而避免了读线程在读取时需要等待释放锁才可以继续读取的缺陷,节约了时间,加快了读线程的读取速度,提供了工作效率。
【专利附图】
【附图说明】
[0022]图1为本发明的一较佳实施例的多线程处理系统的结构图。
【具体实施方式】
[0023]下面结合附图给出本发明较佳实施例,以详细说明本发明的技术方案。
[0024]如图1所示,本发明的多线程处理系统包括一写线程1、多个读线程2以及一全局next指针3。
[0025]本发明的多线程处理系统主要对多个线程共享一主链表进行处理,其中,该写线程I能够对该主链表中的节点进行写操作,而该多个读线程2则能够同时对该主链表中的节点进行读操作,而该主链表中的每个节点均包括一个标志位和节点内容。
[0026]在本实施例中,该主链表中的节点的标志位均具有八位,该标志位能够对该写线程I进行的写操作进行表征。而该写线程I对该主链表进行的写操作主要包括一插入节点的操作、一修改节点的操作或一删除节点的操作,对应地,当该八位中的第一位的值为I时,表征该写操作为该插入节点的操作,当该八位中的第二位的值为I时,表征该写操作为该修改节点的操作,当该八位中的第三位的值为I时,表征该写操作为该删除节点的操作。
[0027]该写线程I具体在对该主链表中的一目标节点进行该插入节点的操作时,就会首先插入一待插入的节点,同时将该目标节点的标志位的第一位赋值为I (其余为O)并使得该全局next指针3指示该目标节点的下一个节点的地址,添加互斥锁后再添加节点内容至该待插入的节点,而在该插入节点的操作完成之后,就会将该目标节点的标志位的第一位还原为O同时解锁,整个的写操作的过程均为原子操作,不会被线程调度机制打断。
[0028]而在该写线程I对该目标节点进行该修改节点的操作时,也会首先将该目标节点的标志位的第二位赋值为I (其余为O)并使得该全局next指针3指示该目标节点的下一个节点的地址,添加互斥锁后再修改该目标节点的节点内容,而在该修改节点的操作完成之后,就会将该目标节点的标志位的第二位还原为O同时解锁,整个过程同样为原子操作,不会被线程调度机制打断。
[0029]而在该写线程I对该目标节点进行该删除节点的操作时,也会首先将该目标节点的标志位的第三位赋值为I (其余为O)并使得该全局next指针3指示该目标节点的下一个节点的地址,添加互斥锁后再删除该目标节点,而在该删除节点的操作完成之后,就直接解锁,整个过程同样为原子操作,不会被线程调度机制打断。
[0030]在该写线程I对该主链表中的该目标节点进行写操作时,该多个读线程2则同时对该主链表进行读操作,当该多个读线程2中的至少一个读线程2读取至该目标节点时,会首先通过互斥锁判断出该目标节点正在被写,此时,该至少一个读线程2就无法读取该目标节点的节点内容,转而读取该全局next指针3指示的该目标节点的下一个节点的地址。这样,该至少一个读线程2就会越过该目标节点而读取该目标节点的下一个节点的节点内容,从而就避免了在读取至该目标节点时,因为该目标节点正在被写而导致该至少一个读线程2都只能等待释放锁才可以继续读取的缺陷,节约了时间,加快了读线程2的读取速度,提供了工作效率。
[0031]同时,每个读线程2均具有一相匹配的副链表,该至少一个读线程2在读取至该目标节点时,还会读取该目标节点的标志位的值,从而对该写操作进行检测。
[0032]如果该至少一个读线程2检测出该目标节点的标志位的第一位或第二位的值为I时,则表明该写操作为该插入节点的操作或该修改节点的操作,此时,该至少一个读线程会将该目标节点的地址保存在与该至少一个读线程2相匹配的副链表中,并且在对该主链表中除该目标节点之外的节点的读操作完成之后,该至少一个读线程2会分别读取相匹配的副链表中保存的该目标节点的地址,从而就能够返回该主链表中读取进行写操作后的该目标节点的内容。
[0033]并且,如果该写操作为该插入节点的操作,则该至少一个读线程2在读取相匹配的副链表中保存的该目标节点的地址后,就返回该主链表中读取进行写操作的该目标节点的内容以及插入的该待插入的节点的内容。
[0034]而如果该至少一个读线程2检测出该目标节点的标志位的第三位的值为I时,则表明该写操作为该删除节点的操作,此时,由于进行删除操作后的该目标节点会从该主链表中消失,该至少一个读线程2只会跳过该目标节点继续读取下一节点,而不会再将该目标节点的地址保存在相匹配的副链表中。
[0035]其中,在本实施例的具体实施过程中,该写线程I的写操作的优先级高于该多个读线程2的读操作。即当该写线程I与读线程2同时准备对同一个节点进行操作时,该写线程I的写操作优先级高于读线程2的读操作,因此会首先对该节点进行写操作,在写操作完成之后才允许读线程2进行读操作,从而保证了读线程2读取的数据为写操作完成之后更新的数据。
[0036]而本发明利用本实施例的多线程处理系统实现的多线程处理方法具体为:该写线程对该主链表进行写操作同时该多个读线程均对该主链表进行读操作,并且当该写线程对该主链表中的一目标节点进行写操作时,该全局next指针3指示该目标节点的下一个节点的地址,而当该至少一个读线程读取至该目标节点时,该至少一个读线程均读取该全局next指针3指示的地址处的节点。
[0037]同时,该至少一个读线程2读取该目标节点的标志位的值,并在检测出该写操作为该插入节点的操作或该修改节点的操作时,分别将该目标节点的地址保存在与该至少一个读线程2相匹配的副链表中,并在对该主链表中除该目标节点之外的节点的读操作完成之后分别读取与该至少一个读线程2相匹配的副链表中保存的该目标节点的地址,以返回该主链表中读取该目标节点,至此流程结束。
[0038]虽然以上描述了本发明的【具体实施方式】,但是本领域的技术人员应当理解,这些仅是举例说明,本发明的保护范围是由所附权利要求书限定的。本领域的技术人员在不背离本发明的原理和实质的前提下,可以对这些实施方式做出多种变更或修改,但这些变更和修改均落入本发明的保护范围。
【权利要求】
1.一种多线程处理系统,其特征在于,其包括一写线程、多个读线程以及一全局next指针,该写线程用于对一主链表进行写操作,该多个读线程均用于对该主链表进行读操作; 当该写线程对该主链表中的一目标节点进行写操作时,该全局next指针用于指示该目标节点的下一个节点的地址; 当该多个读线程中的至少一个读线程读取至该目标节点时,该至少一个读线程均用于读取该全局next指针指示的地址处的节点。
2.如权利要求1所述的多线程处理系统,其特征在于,该写线程对该主链表进行的写操作为一插入节点的操作、一修改节点的操作或一删除节点的操作,该主链表中的每个节点均包括一标志位,该写线程还用于在对该目标节点进行写操作时对该目标节点的标志位进行赋值,以表征该写操作为该插入节点的操作、该修改节点的操作或该删除节点的操作; 每个该读线程均具有一相匹配的副链表,该至少一个读线程还用于读取该目标节点的标志位的值,并在检测出该写操作为该插入节点的操作或该修改节点的操作时,分别将该目标节点的地址保存在与该至少一个读线程相匹配的副链表中,并在对该主链表中除该目标节点之外的节点的读操作完成之后分别读取与该至少一个读线程相匹配的副链表中保存的该目标节点的地址,以返回该主链表中读取该目标节点。
3.如权利要求2所述的多线程处理系统,其特征在于,该目标节点的标志位有八位,当该八位中的第一位的值为I时,表征该写操作为该插入节点的操作,当该八位中的第二位的值为I时,表征该写操作为该修改节点的操作,当该八位中的第三位的值为I时,表征该写操作为该删除节点的操作。
4.如权利要求1-3中任意一项所述的多线程处理系统,其特征在于,该写线程的写操作的优先级高于该多个读线程的读操作。
5.一种多线程处理方法,其特征在于,其利用如权利要求1所述的多线程处理系统实现,该多线程处理方法为:该写线程对该主链表进行写操作同时该多个读线程均对该主链表进行读操作,并且当该写线程对该主链表中的一目标节点进行写操作时,该全局next指针指示该目标节点的下一个节点的地址,而当该至少一个读线程读取至该目标节点时,该至少一个读线程均读取该全局next指针指示的地址处的节点。
6. 如权利要求5所述的多线程处理方法,其特征在于,该写线程对该主链表进行的写操作为一插入节点的操作、一修改节点的操作或一删除节点的操作,该主链表中的每个节点均包括一标志位,该写线程还在对该目标节点进行写操作时对该目标节点的标志位进行赋值,以表征该写操作为该插入节点的操作、该修改节点的操作或该删除节点的操作; 每个该读线程均具有一相匹配的副链表,该至少一个读线程还读取该目标节点的标志位的值,并在检测出该写操作为该插入节点的操作或该修改节点的操作时,分别将该目标节点的地址保存在与该至少一个读线程相匹配的副链表中,并在对该主链表中除该目标节点之外的节点的读操作完成之后分别读取与该至少一个读线程相匹配的副链表中保存的该目标节点的地址,以返回该主链表中读取该目标节点。
7.如权利要求6所述的多线程处理方法,其特征在于,该目标节点的标志位有八位,当该八位中的第一位的值为I时,表征该写操作为该插入节点的操作,当该八位中的第二位的值为I时,表征该写操作为该修改节点的操作,当该八位中的第三位的值为I时,表征该写操作为该删除节点的操作。
8.如权利要求5-7中任意一项所述的多线程处理方法,其特征在于,该写线程的写操作的优先级高于该多个读线程`的读操作。
【文档编号】G06F9/46GK103677971SQ201210357027
【公开日】2014年3月26日 申请日期:2012年9月21日 优先权日:2012年9月21日
【发明者】吴振玉, 郑润 申请人:上海斐讯数据通信技术有限公司