一种无锁的多线程数据同步方法.pdf

上传人:b*** 文档编号:628808 上传时间:2018-02-27 格式:PDF 页数:7 大小:764.36KB
返回 下载 相关 举报
摘要
申请专利号:

CN201410346306.2

申请日:

2014.07.18

公开号:

CN104123177A

公开日:

2014.10.29

当前法律状态:

实审

有效性:

审中

法律详情:

实质审查的生效IPC(主分类):G06F 9/46申请日:20140718|||公开

IPC分类号:

G06F9/46; G06F9/52

主分类号:

G06F9/46

申请人:

无锡梵天信息技术股份有限公司

发明人:

张翼

地址:

214000 江苏省无锡市新区太科园传感网大学科技园立业楼E区711号

优先权:

专利代理机构:

北京品源专利代理有限公司 11332

代理人:

邓猛烈;孟金喆

PDF下载: PDF下载
内容摘要

本发明公开一种无锁的多线程数据同步方法,包括如下步骤:A、主线程接收消息,并分派处理消息。B、判断子线程是否为挂起状态,若是,则执行步骤C,否则,无操作。C、主线程创建队列1,并将队列1中的文件拷贝到队列2,然后清除队列1中的数据。D、主线程设置信号对象为有信号状态。E、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3。F、判断子线程是否为挂起状态,若是,则执行步骤G,否则,无操作。G、主线程将队列3中的数据拷贝到队列4,并清除队列3中的数据。H、将创建好的对象插入队列1,并设置信号对象为有信号状态。本发明解决了主线程和子线程访问对象出现死锁的问题。

权利要求书

1.  一种无锁的多线程数据同步方法,其特征在于,包括如下步骤:
A、主线程接收消息,并分派处理消息;
B、判断子线程是否为挂起状态,若是,则执行步骤C,否则,无操作;
C、主线程创建包含所有需要加载文件的队列1,并将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据;
D、主线程设置信号对象为有信号状态;
E、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3;
F、判断子线程是否为挂起状态,若是,则执行步骤G,否则,无操作;
G、主线程将队列3中的数据拷贝到队列4,并清除队列3中的数据;
H、将创建好的对象插入队列1,并设置信号对象为有信号状态。

2.
  根据权利要求1所述的无锁的多线程数据同步方法,其特征在于,所述步骤E具体包括:子线程得到信号,遍历队列2中的文件,并抽取和检索需要加载的文件及创建对象,将创建完成后的对象插入队列3。

3.
  根据权利要求1或2任一项所述的无锁的多线程数据同步方法,其特征在于,所述步骤H具体包括:将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态。

说明书

一种无锁的多线程数据同步方法
技术领域
本发明涉及计算机技术领域,尤其涉及一种无锁的多线程数据同步方法。
背景技术
随着计算机系统的发展,图形处理单元(Graphic Processing Unit,GPU)的绘制功能从中央处理器(CPU)解放出来。这样就大大提高了图形绘制的速度。之前对图像绘制的所有计算工作均由CPU完成,重建速度慢,难以达到实时绘制的要求,然而计算机图形硬件性能的不断提高,使得利用图形处理单元对数据进行实时交互操作成为可能。在应用程序中,每个应用程序就是一个进程,进程由一个或多个线程组成。没有线程,进程的资源就不能被CPU所利用。对于一个应用而言,一个好的架构设计既能让各个部件发挥其功能并分步有序执行,又能节约时间效率。每个程序都会创建一个线程,这个线程会通知CPU有一个新的任务要处理。在单线程里,主线程既要接受消息,其包含键盘消息、鼠标消息、脚本消息及网络消息等,又要处理消息的任务。而在多线程里,主线程会把加载场景文件、模型等任务指派给子线程去加载,子线程加载完成后只要通过一个标识来通知主线程就可以了,这样的话,多个线程并发的处理逻辑,大大增加了使用CPU的时间,从而提高运行效率。上述多线程架构模型是普通的模式,当子线程加载这些文件的过程中,主线程是不允许访问的,然而有些文件是供主子线程共享的。当需要同步对象时,如果主线程和子线程同时读一份数据或者一读一写时,不会出现问题,但是,如果多线程要同时写一份数据,就会出现并发错误。因为在同时写同一份数据时,每个线程是有共享保护的。所有的内核对象都有保护共享数据的功能,都需要等待信号对象,在等 待过程中将耗费大量时间。
发明内容
本发明的目的在于通过一种无锁的多线程数据同步方法,来解决以上背景技术部分提到的问题。
为达此目的,本发明采用以下技术方案:
一种无锁的多线程数据同步方法,其包括如下步骤:
A、主线程接收消息,并分派处理消息;
B、判断子线程是否为挂起状态或休眠状态,若是,则执行步骤C,否则,无操作;
C、主线程创建包含所有需要加载文件的队列1,并将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据;
D、主线程设置信号对象为有信号状态;
E、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3;
F、判断子线程是否为挂起状态或休眠状态,若是,则执行步骤G,否则,无操作;
G、主线程将队列3中的数据拷贝到队列4,并清除队列3中的数据;
H、将创建好的对象插入队列1,并设置信号对象为有信号状态。
特别地,所述步骤E具体包括:子线程得到信号,遍历队列2中的文件,并抽取和检索需要加载的文件及创建对象,将创建完成后的对象插入队列3。
特别地,所述步骤H具体包括:将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态。
本发明提出的无锁的多线程数据同步方法利用队列间的帧同步替代了对象 间的同步,主线程只需要花费很少的时间即可对队列间的帧对象进行判断,解决了主线程和子线程访问对象出现死锁的问题。
附图说明
图1为本发明实施例提供的无锁的多线程数据同步方法流程图。
具体实施方式
下面结合附图和实施例对本发明作进一步说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。
请参照图1所示,图1为本发明实施例提供的无锁的多线程数据同步方法流程图。
本实施例中无锁的多线程数据同步方法具体包括如下步骤:
步骤S101、主线程接收消息,并分派处理消息。
步骤S102、主线程判断子线程是否为挂起状态或休眠状态(sleep),若是,则执行步骤S103,否则,无操作。
步骤S103、主线程创建包含所有需要加载文件的队列1,并将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据。
主线程中创建一个队列,这个队列就像一个容器,包含了所有需要加载的文件。把容器中包含的所有文件设定为队列1。主线程将需要加载的对象存放在队列1中。当子线程挂起或休眠时,主线程另开辟一个队列2,把队列1中所有需要加载的文件拷贝到队列2中,即交换队列数据,并清除队列1中的数据。
步骤S104、主线程设置信号对象为有信号状态。
步骤S105、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3。
子线程遍历队列2中的文件,并抽取和检索需要加载的文件及创建对象,将创建完成后的对象插入队列3。
步骤S106、主线程判断子线程是否为挂起状态或休眠状态,若是,则执行步骤S107,否则,无操作。
步骤S107、主线程将队列3中的数据拷贝到队列4中,并清除队列3中的数据。
步骤S108、将创建好的对象插入队列1,并设置信号对象为有信号状态。
将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态。
下面以计算机语言的形式,对本实施例中主线程和子线程的处理逻辑进行扼要说明。
主线程处理逻辑:

1.判断子线程是否为挂起状态或休眠状态,若是,则将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据,否则,无操作
2.判断子线程是否为挂起状态或休眠状态,若是,则将队列3中的数据拷贝到队列4,并清除队列3中的数据,否则,无操作
(如果设置了回调函数,调用回调函数)
3.将需要创建对象的文件名,及其他参数插入队列1,并设置信 号对象为有信号状态

遍历队列2中的每个对象,并加载每个对象,把所有创建的对象插入到队列3中
(如果设置了回调函数,调用回调函数)
挂起信号对象
Sleep(20);
}
从上面的流程可以看出,在本实施例中使用了4个队列,分别是队列1、队列2、队列3以及队列4。队列1和队列4被主线程使用,队列2和队列3被子线程使用。队列1是供主线程存放需要加载的对象。队列2是把队列1中的数据拷贝过来;因为子线程需要访问队列1中的数据,可是队列1是主线程在使用,所以为了安全,额外开辟了一个队列2,供给子线程使用。从队列1中的数据拷贝到队列2的过程中,子线程为挂起状态或休眠状态的情况下才是安全的。子线程访问队列2中的数据,然后循环调用加载对象并把创建好的对象插入到队列3中。待子线程为挂起状态或休眠状态的时候,再把队列3中的数据拷贝到队列4中。
本发明的技术方案利用队列间的帧同步替代了对象间的同步,主线程只需 要花费很少的时间即可对队列间的帧对象进行判断,解决了主线程和子线程共享统一对象时读写数据存在的问题。
注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

一种无锁的多线程数据同步方法.pdf_第1页
第1页 / 共7页
一种无锁的多线程数据同步方法.pdf_第2页
第2页 / 共7页
一种无锁的多线程数据同步方法.pdf_第3页
第3页 / 共7页
点击查看更多>>
资源描述

《一种无锁的多线程数据同步方法.pdf》由会员分享,可在线阅读,更多相关《一种无锁的多线程数据同步方法.pdf(7页珍藏版)》请在专利查询网上搜索。

1、10申请公布号CN104123177A43申请公布日20141029CN104123177A21申请号201410346306222申请日20140718G06F9/46200601G06F9/5220060171申请人无锡梵天信息技术股份有限公司地址214000江苏省无锡市新区太科园传感网大学科技园立业楼E区711号72发明人张翼74专利代理机构北京品源专利代理有限公司11332代理人邓猛烈孟金喆54发明名称一种无锁的多线程数据同步方法57摘要本发明公开一种无锁的多线程数据同步方法,包括如下步骤A、主线程接收消息,并分派处理消息。B、判断子线程是否为挂起状态,若是,则执行步骤C,否则,无操作。

2、。C、主线程创建队列1,并将队列1中的文件拷贝到队列2,然后清除队列1中的数据。D、主线程设置信号对象为有信号状态。E、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3。F、判断子线程是否为挂起状态,若是,则执行步骤G,否则,无操作。G、主线程将队列3中的数据拷贝到队列4,并清除队列3中的数据。H、将创建好的对象插入队列1,并设置信号对象为有信号状态。本发明解决了主线程和子线程访问对象出现死锁的问题。51INTCL权利要求书1页说明书4页附图1页19中华人民共和国国家知识产权局12发明专利申请权利要求书1页说明书4页附图1页10申请公布号CN104123177A。

3、CN104123177A1/1页21一种无锁的多线程数据同步方法,其特征在于,包括如下步骤A、主线程接收消息,并分派处理消息;B、判断子线程是否为挂起状态,若是,则执行步骤C,否则,无操作;C、主线程创建包含所有需要加载文件的队列1,并将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据;D、主线程设置信号对象为有信号状态;E、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3;F、判断子线程是否为挂起状态,若是,则执行步骤G,否则,无操作;G、主线程将队列3中的数据拷贝到队列4,并清除队列3中的数据;H、将创建好的对象插入队列1,并设置信号对象为有信。

4、号状态。2根据权利要求1所述的无锁的多线程数据同步方法,其特征在于,所述步骤E具体包括子线程得到信号,遍历队列2中的文件,并抽取和检索需要加载的文件及创建对象,将创建完成后的对象插入队列3。3根据权利要求1或2任一项所述的无锁的多线程数据同步方法,其特征在于,所述步骤H具体包括将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态。权利要求书CN104123177A1/4页3一种无锁的多线程数据同步方法技术领域0001本发明涉及计算机技术领域,尤其涉及一种无锁的多线程数据同步方法。背景技术0002随着计算机系统的发展,图形处理单元GRAPHICPROCESSINGUNIT,G。

5、PU的绘制功能从中央处理器CPU解放出来。这样就大大提高了图形绘制的速度。之前对图像绘制的所有计算工作均由CPU完成,重建速度慢,难以达到实时绘制的要求,然而计算机图形硬件性能的不断提高,使得利用图形处理单元对数据进行实时交互操作成为可能。在应用程序中,每个应用程序就是一个进程,进程由一个或多个线程组成。没有线程,进程的资源就不能被CPU所利用。对于一个应用而言,一个好的架构设计既能让各个部件发挥其功能并分步有序执行,又能节约时间效率。每个程序都会创建一个线程,这个线程会通知CPU有一个新的任务要处理。在单线程里,主线程既要接受消息,其包含键盘消息、鼠标消息、脚本消息及网络消息等,又要处理消息。

6、的任务。而在多线程里,主线程会把加载场景文件、模型等任务指派给子线程去加载,子线程加载完成后只要通过一个标识来通知主线程就可以了,这样的话,多个线程并发的处理逻辑,大大增加了使用CPU的时间,从而提高运行效率。上述多线程架构模型是普通的模式,当子线程加载这些文件的过程中,主线程是不允许访问的,然而有些文件是供主子线程共享的。当需要同步对象时,如果主线程和子线程同时读一份数据或者一读一写时,不会出现问题,但是,如果多线程要同时写一份数据,就会出现并发错误。因为在同时写同一份数据时,每个线程是有共享保护的。所有的内核对象都有保护共享数据的功能,都需要等待信号对象,在等待过程中将耗费大量时间。发明内。

7、容0003本发明的目的在于通过一种无锁的多线程数据同步方法,来解决以上背景技术部分提到的问题。0004为达此目的,本发明采用以下技术方案0005一种无锁的多线程数据同步方法,其包括如下步骤0006A、主线程接收消息,并分派处理消息;0007B、判断子线程是否为挂起状态或休眠状态,若是,则执行步骤C,否则,无操作;0008C、主线程创建包含所有需要加载文件的队列1,并将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据;0009D、主线程设置信号对象为有信号状态;0010E、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建好的对象插入到队列3;0011F、判断子线程是否为。

8、挂起状态或休眠状态,若是,则执行步骤G,否则,无操作;0012G、主线程将队列3中的数据拷贝到队列4,并清除队列3中的数据;0013H、将创建好的对象插入队列1,并设置信号对象为有信号状态。说明书CN104123177A2/4页40014特别地,所述步骤E具体包括子线程得到信号,遍历队列2中的文件,并抽取和检索需要加载的文件及创建对象,将创建完成后的对象插入队列3。0015特别地,所述步骤H具体包括将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态。0016本发明提出的无锁的多线程数据同步方法利用队列间的帧同步替代了对象间的同步,主线程只需要花费很少的时间即可对队列间的帧。

9、对象进行判断,解决了主线程和子线程访问对象出现死锁的问题。附图说明0017图1为本发明实施例提供的无锁的多线程数据同步方法流程图。具体实施方式0018下面结合附图和实施例对本发明作进一步说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部内容。0019请参照图1所示,图1为本发明实施例提供的无锁的多线程数据同步方法流程图。0020本实施例中无锁的多线程数据同步方法具体包括如下步骤0021步骤S101、主线程接收消息,并分派处理消息。0022步骤S102、主线程判断子线程是否为挂起状态或休眠状。

10、态SLEEP,若是,则执行步骤S103,否则,无操作。0023步骤S103、主线程创建包含所有需要加载文件的队列1,并将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据。0024主线程中创建一个队列,这个队列就像一个容器,包含了所有需要加载的文件。把容器中包含的所有文件设定为队列1。主线程将需要加载的对象存放在队列1中。当子线程挂起或休眠时,主线程另开辟一个队列2,把队列1中所有需要加载的文件拷贝到队列2中,即交换队列数据,并清除队列1中的数据。0025步骤S104、主线程设置信号对象为有信号状态。0026步骤S105、子线程得到信号,遍历队列2中的文件,循环调用加载对象并把创建。

11、好的对象插入到队列3。0027子线程遍历队列2中的文件,并抽取和检索需要加载的文件及创建对象,将创建完成后的对象插入队列3。0028步骤S106、主线程判断子线程是否为挂起状态或休眠状态,若是,则执行步骤S107,否则,无操作。0029步骤S107、主线程将队列3中的数据拷贝到队列4中,并清除队列3中的数据。0030步骤S108、将创建好的对象插入队列1,并设置信号对象为有信号状态。0031将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态。0032下面以计算机语言的形式,对本实施例中主线程和子线程的处理逻辑进行扼要说明。说明书CN104123177A3/4页50033主。

12、线程处理逻辑003400351判断子线程是否为挂起状态或休眠状态,若是,则将队列1中所有需要加载的文件拷贝到队列2,然后清除队列1中的数据,否则,无操作00362判断子线程是否为挂起状态或休眠状态,若是,则将队列3中的数据拷贝到队列4,并清除队列3中的数据,否则,无操作0037如果设置了回调函数,调用回调函数00383将需要创建对象的文件名,及其他参数插入队列1,并设置信号对象为有信号状态00390040遍历队列2中的每个对象,并加载每个对象,把所有创建的对象插入到队列3中0041如果设置了回调函数,调用回调函数0042挂起信号对象0043SLEEP20;00440045从上面的流程可以看出,。

13、在本实施例中使用了4个队列,分别是队列1、队列2、队列3以及队列4。队列1和队列4被主线程使用,队列2和队列3被子线程使用。队列1是供主线程存放需要加载的对象。队列2是把队列1中的数据拷贝过来;因为子线程需要访问队列1中的数据,可是队列1是主线程在使用,所以为了安全,额外开辟了一个队列2,供给子线程使用。从队列1中的数据拷贝到队列2的过程中,子线程为挂起状态或休眠状态的情况下才是安全的。子线程访问队列2中的数据,然后循环调用加载对象并把创建好的说明书CN104123177A4/4页6对象插入到队列3中。待子线程为挂起状态或休眠状态的时候,再把队列3中的数据拷贝到队列4中。0046本发明的技术方。

14、案利用队列间的帧同步替代了对象间的同步,主线程只需要花费很少的时间即可对队列间的帧对象进行判断,解决了主线程和子线程共享统一对象时读写数据存在的问题。0047注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。说明书CN104123177A1/1页7图1说明书附图CN104123177A。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 物理 > 计算;推算;计数


copyright@ 2017-2020 zhuanlichaxun.net网站版权所有
经营许可证编号:粤ICP备2021068784号-1