技术简介:
本专利针对多线程环境下资源竞争导致软件异常的问题,提出通过插入同步锁组(含释放锁与计数锁)控制代码执行顺序的解决方案。根据预设目标顺序为代码指令设置同步锁,在释放锁触发后递减计数锁值,当计数值达目标值时允许后续指令运行,从而强制多线程按预设顺序执行,避免资源破坏。
关键词:同步锁,资源保护
1.本发明涉及通信领域,具体而言,涉及一种待运行线程的运行方法及装置、存储介质、电子装置。
背景技术:2.在使用多线程方式进行软件开发的过程中,往往伴随多个线程对同一资源的竞争。一旦被竞争的资源没有保护好遭到了破坏,就会导致软件运行异常。多线程资源竞争导致的软件异常一般都是不定期发生,大大增加了开发人员排查问题的难度,需要耗费大量时间。多线程的问题难查,主要是多线程对同一资源访问的顺序是不确定的。
3.针对相关技术中,在多线程运行过程中,由于多线程访问资源的运行顺序的无法确定,进而导致资源容易被破坏等问题,尚未提出有效的解决方案。
技术实现要素:4.本发明实施例提供了一种待运行线程的运行方法及装置、存储介质、电子装置,以至少解决相关技术中,在多线程运行过程中,由于多线程访问资源的运行顺序的无法确定,进而导致资源容易被破坏等问题。
5.根据本发明实施例的一个方面,提供了一种待运行线程的运行方法,包括:确定至少两个待运行线程包括的多个代码指令,以及所述多个代码指令的目标运行顺序;根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值,所述n为正整数;运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行。
6.在一个示例性实施例中,根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,包括:获取多组同步锁,其中,所述多组同步锁中的每一组同步锁均包括:一个或n个第一同步锁,一个第二同步锁;所述第二同步锁的初始计数值为n;将所述多组同步锁按照所述目标运行顺序设置在所述多个代码指令中的每一个代码指令的相邻位置。
7.在一个示例性实施例中,将对应有预设运行顺序的所述多组同步锁按照所述目标运行顺序设置在所述多个代码指令中的每一个代码指令的相邻位置的过程中,所述方法还包括:对于所述多个代码指令中首个运行的第一代码指令,在所述第一代码指令之后的相邻位置设置一个或多个第一同步锁,并将与该一个或多个第一同步锁为同一组同步锁的第二同步锁设置在第二代码指令之前的相邻位置,其中,所述第二代码指令为所述目标运行顺序所指示的所述第一代码指令之后的代码指令。
8.在一个示例性实施例中,将对应有预设运行顺序的所述多组同步锁按照所述目标
运行顺序设置在所述多个代码指令中的每一个代码指令的相邻位置的过程中,所述方法还包括:对于所述多个代码指令中的中间运行的第三代码指令,在所述第三代码指令之前的相邻位置设置第二同步锁,在所述第三代码指令之后的相邻位置设置一个或多个第一同步锁;其中,在所述第三代码指令之前的相邻位置设置的第二同步锁与第四代码指令之后的相邻位置设置的一个或多个第一同步锁为同一组同步锁,在所述第三代码指令之后的相邻位置设置的一个或多个第一同步锁,与第五代码指令之前的相邻位置设置的第二同步锁为同一组同步锁,所述第四代码指令为所述目标运行顺序所指示的所述第三代码指令之前的代码指令,所述第五代码指令为所述目标运行顺序所指示的所述第三代码指令之后的代码指令。
9.在一个示例性实施例中,将对应有预设运行顺序的所述多组同步锁按照所述目标运行顺序设置在所述多个代码指令中的每一个代码指令的相邻位置的过程中,所述方法还包括:对于所述多个代码指令中最后运行的第六代码指令,在所述第六代码指令之前的相邻位置设置第二同步锁,并将与该第二同步锁为同一组同步锁的一个或多个第一同步锁设置在第七代码指令之后的相邻位置,其中,所述第七代码指令为所述目标运行顺序所指示的所述第六代码指令之前的代码指令。
10.在一个示例性实施例中,将所述一组同步锁插入到所述每一个代码指令的相邻位置的过程中,所述方法还包括:对于所述一组同步锁中的第一同步锁,确定任一第一同步锁所在的代码指令行所对应的第一机器码指令;将所述第一机器码指令中的第一字节指令替换为中断指令,并记录所述机器码指令在可执行文件中的第一地址以及所述第一字节指令。
11.在一个示例性实施例中,将所述一组同步锁插入到所述每一个代码指令的相邻位置之后,所述方法还包括:在执行到所述任一第一同步锁的情况下,执行所述中断指令,以指示所述至少两个待运行线程暂停运行;在可执行文件中的第一地址将中断指令替换为所述第一字节指令。
12.在一个示例性实施例中,将所述一组同步锁插入到所述每一个代码指令的相邻位置的过程中,所述方法还包括:对于所述一组同步锁中的第二同步锁,确定任一第二同步锁所在的代码指令行所对应的第二机器码指令;将所述第二机器码指令种的第二字节指令替换为死循环指令,并记录所述机器码指令在可执行文件中的第二地址以及所述第二字节指令。
13.在一个示例性实施例中,将所述一组同步锁插入到所述每一个代码指令的相邻位置之后,所述方法还包括:在执行到所述任一第二同步锁的情况下,执行所述死循环指令,以指示所述至少两个待运行线程终止运行;确定与所述任一第二同步锁为同一组同步锁的一个或多个第一同步锁对应的计数值是否计数到目标值;在与所述任一第二同步锁为同一组同步锁的一个或多个第一同步锁对应的计数值计数到所述目标值的情况下,在可执行文件中的第二地址将所述死循环指令替换为所述第二字节指令。
14.根据本发明实施例的另一个方面,还提供了一种待运行线程的运行装置,包括:确定模块,用于确定至少两个待运行线程包括的多个代码指令,以及所述多个代码指令的目标运行顺序;处理模块,用于根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其
中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值,所述n为正整数;运行模块,用于运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行。
15.根据本发明实施例的另一方面,还提供了一种计算机可读的存储介质,其特征在于,所述计算机可读的存储介质包括存储的程序,其中,所述程序运行时运行上述待运行线程的运行方法。
16.根据本发明实施例的又一方面,还提供了一种电子装置,包括存储器和处理器,其特征在于,所述存储器中存储有计算机程序,所述处理器通过所述计算机程序运行上述待运行线程的运行方法。
17.在本发明实施例中,根据多个代码指令对应的目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值;运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行,也就是说,通过在多个代码指令的相邻位置设置同步锁,进而可以控制多个代码指令按照预设的目标运行顺序进行运行,解决了相关技术中,在多线程运行过程中,由于多线程访问资源的运行顺序的无法确定,进而导致资源容易被破坏等问题,进而控制多个代码指令按照预设的目标运行顺序进行运行,使得资源不易被破坏。
附图说明
18.此处所说明的附图用来提供对本发明的进一步理解,构成本发明的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
19.图1是本发明实施例的一种待运行线程的运行方法的计算机终端的硬件结构框图;
20.图2是根据本发明实施例的一种可选的待运行线程的运行方法的流程图;
21.图3是本发明实施例的一种可选的待运行线程的运行流程的添加同步锁的示意图;
22.图4是本发明实施例的一种可选的目标运行顺序的显示示意图;
23.图5是根据本发明实施例的一种待运行线程的运行装置的结构框图。
具体实施方式
24.为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分的实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都应当属于本发明保护的范围。
25.需要说明的是,本发明的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的本发明的实施例能够以除了在这里图示或描述的那些以外的顺序实施。此外,术语“包括”和“具有”以及他们的任何变形,意图在于覆盖不排他的包含,例如,包含了一系列步骤或单元的过程、方法、系统、产品或设备不必限于清楚地列出的那些步骤或单元,而是可包括没有清楚地列出的或对于这些过程、方法、产品或设备固有的其它步骤或单元。
26.本发明实施例所提供的方法实施例可以在计算机终端中运行。以运行在计算机终端上为例,图1是本发明实施例的一种待运行线程的运行方法的计算机终端的硬件结构框图。如图1所示,计算机终端可以包括一个或多个(图1中仅示出一个)处理器102(处理器102可以包括但不限于微处理器mcu或可编程逻辑器件fpga等的处理系统)和用于存储数据的存储器104,在一个示例性实施例中,上述计算机终端还可以包括用于通信功能的传输设备106以及输入输出设备108。本领域普通技术人员可以理解,图1所示的结构仅为示意,其并不对上述计算机终端的结构造成限定。例如,摄像设备还可包括比图1中所示更多或者更少的组件,或者具有与图1所示等同功能或比图1所示功能更多的不同的配置。
27.存储器104可用于存储计算机程序,例如,应用软件的软件程序以及模块,如本发明实施例中的待运行线程的运行方法对应的计算机程序,处理器102通过运行存储在存储器104内的计算机程序,从而运行各种功能应用以及数据处理,即实现上述的方法。存储器104可包括高速随机存储器,还可包括非易失性存储器,如一个或者多个磁性存储系统、闪存、或者其他非易失性固态存储器。在一些实例中,存储器104可进一步包括相对于处理器102远程设置的存储器,这些远程存储器可以通过网络连接至安全文本。上述网络的实例包括但不限于互联网、企业内部网、局域网、移动通信网及其组合。
28.传输设备106用于经由一个网络接收或者发送数据。上述的网络具体实例可包括摄像设备的通信供应商提供的无线网络。在一个实例中,传输系统106包括一个网络适配器(network interface controller,简称为nic),其可通过基站与其他网络设备相连从而可与互联网进行通讯。
29.在本实施例中提供了一种待运行线程的运行方法,包括但不限于应用于上述计算机终端,图2是根据本发明实施例的一种可选的待运行线程的运行方法的流程图,该流程包括如下步骤:
30.步骤s202,确定至少两个待运行线程包括的多个代码指令,以及所述多个代码指令的目标运行顺序;
31.需要说明的是,本发明实施例的目标运行顺序可以是根据目标对象的设置指令所设置的顺序,也可以是根据预设规则确定出的运行顺序,本发明实施例对此不进行限定。
32.步骤s204,根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值,所述n为正整数;
33.步骤s206,运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代
码指令按照所述目标运行顺序运行。
34.通过本发明实施例的上述技术方案,根据多个代码指令对应的目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值;运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行,也就是说,通过在多个代码指令的相邻位置设置同步锁,进而可以控制多个代码指令按照预设的目标运行顺序进行运行,解决了相关技术中,在多线程运行过程中,由于多线程访问资源的运行顺序无法确定,进而导致资源容易被破坏等问题,进而控制多个代码指令按照预设的目标运行顺序进行运行,使得资源不易被破坏。
35.上述步骤s204有多种实现方式,在一个可选的实施例中,可以通过以下方式实现:获取多组同步锁,其中,所述多组同步锁中的每一组同步锁均包括:一个或n个第一同步锁,一个第二同步锁;所述第二同步锁的初始计数值为n;将所述多组同步锁按照所述目标运行顺序设置在所述多个代码指令中的每一个代码指令的相邻位置。
36.可以理解的是,在多个代码指令的数量是m个时,获取到的多组同步锁的数量是m-1组,进而根据m-1组同步锁为m个代码指令设置同步锁。具体地,n的取值决定了一组同步锁中第一同步锁的数量,n为正整数,即n可以取值1,2,
……
,n,本发明实施例对此不进行限定。
37.以n取值为1,第一同步锁为释放锁,第二同步锁为计数锁为例,如图3所示,共有5组同步锁,每一组同步锁均包括一个释放锁和一个计数锁。
38.对于上述m个代码指令,由于每个指令在目标执行顺序中的位置是不同的,对于不同位置的代码指令,需采用不同的同步锁的设置方式,具体如下:
39.1)对于所述多个代码指令中首个运行的第一代码指令,在所述第一代码指令之后的相邻位置设置一个或多个第一同步锁,并将与该一个或多个第一同步锁为同一组同步锁的第二同步锁设置在第二代码指令之前的相邻位置,其中,所述第二代码指令为所述目标运行顺序所指示的所述第一代码指令之后的代码指令。
40.以图4为例,图4显示了对于代码指令1-代码指令6,想要确定的目标执行顺序代码指令1-代码指令4-代码指令2-代码指令5-代码指令3-代码指令6。对于第一代码指令(即附图3-4中的代码指令1),在代码指令1之后的位置设置释放锁1,并将与释放锁1在一组同步锁的计数锁1设置在代码指令4之前的位置上。
41.2)对于所述多个代码指令中的中间运行的第三代码指令,在所述第三代码指令之前的相邻位置设置第二同步锁,在所述第三代码指令之后的相邻位置设置一个或多个第一同步锁;其中,在所述第三代码指令之前的相邻位置设置的第二同步锁与第四代码指令之后的相邻位置设置的一个或多个第一同步锁为同一组同步锁,在所述第三代码指令之后的相邻位置设置的一个或多个第一同步锁,与第五代码指令之前的相邻位置设置的第二同步锁为同一组同步锁,所述第四代码指令为所述目标运行顺序所指示的所述第三代码指令之前的代码指令,所述第五代码指令为所述目标运行顺序所指示的所述第三代码指令之后的代码指令。
42.具体参见附图4,代码指令4、代码指令2、代码指令5和代码指令3均可以理解为是中间运行的第三代码指令,即第三代码指令很可能为多个。以代码指令5为例,在代码指令5之前的位置设置计数锁3,在代码指令5之后的位置设置释放锁4,与计数锁3在同一组同步锁的释放锁3放置在代码指令2之后的位置,与释放锁4在同一组同步锁的计数锁4设置在代码指令3之前的位置。
43.3)对于所述多个代码指令中最后运行的第六代码指令,在所述第六代码指令之前的相邻位置设置第二同步锁,并将与该第二同步锁为同一组同步锁的一个或多个第一同步锁设置在第七代码指令之后的相邻位置,其中,所述第七代码指令为所述目标运行顺序所指示的所述第六代码指令之前的代码指令。
44.具体参见附图4,代码指令6为多个代码指令中最后执行的代码指令,在代码指令6之前的位置设置计数锁5,与计数锁5在同一组同步锁的释放锁5设置在代码指令3之后的位置上。
45.基于上述同步锁的设置方式,具体参照附图3,在执行代码指令1之后,执行一次释放锁1,计数锁1的计数值由于释放锁1被执行一次,因此计数值由1变为0(相当于上述实施例中的目标值),由于计数锁1的计数值已为0,即允许执行计数锁1后的代码指令,因此,在执行释放锁1以后,执行计数锁1,进而执行计数锁1后的代码指令4。在执行完代码指令4以后,执行释放锁2,同理,再执行计数锁2,由于计数锁2的计数值已为0,因此,可以执行计数锁2后的代码指令2。以此类推,依次执行代码指令5,代码指令3和代码指令6。
46.对于第一同步锁(可选地,可以是一种释放锁)的功能的实现方式,本发明实施例提供了一个可选实现方案:对于所述一组同步锁中的第一同步锁,确定任一第一同步锁所在的代码指令行所对应的第一机器码指令;将所述第一机器码指令中的第一字节指令替换为中断指令,并记录所述机器码指令在可执行文件中的第一地址以及所述第一字节指令。在上述准备工作已执行完以后,在执行到所述任一第一同步锁的情况下,执行所述中断指令,以指示所述至少两个待运行线程暂停运行;在可执行文件中的第一地址将中断指令替换为所述第一字节指令。
47.可以理解的是,对于上述技术方案中任一释放锁的工作原理可以理解如下:具体参照附图3,以代码指令1之后相邻位置插入的释放锁1为例,释放锁1插入到代码指令1之后相邻位置后,工具找到释放锁1插入的代码指令行在可执行文件中对应的第一机器码指令,把第一机器码指令的首字节指令替换成软中断(int3)指令,记录第一机器码指令的第一地址和首字节指令。同步锁插入后,运行可执行文件,运行到释放锁1,执行软中断(int3)指令,线程a暂停运行,在可执行文件中的第一地址将软中断(int3)指令替换回首字节指令。
48.对于第二同步锁(可选地,可以是一种计数锁)的功能的实现方式,本发明实施例提供了一个可选实现方案:对于所述一组同步锁中的第二同步锁,确定任一第二同步锁所在的代码指令行所对应的第二机器码指令;将所述第二机器码指令种的第二字节指令替换为死循环指令,并记录所述机器码指令在可执行文件中的第二地址以及所述第二字节指令。在上述准备工作已执行完以后,在执行到所述任一第二同步锁的情况下,执行所述死循环指令,以指示所述至少两个待运行线程终止运行;确定与所述任一第二同步锁为同一组同步锁的一个或多个第一同步锁对应的计数值是否计数到目标值;在与所述任一第二同步锁为同一组同步锁的一个或多个第一同步锁对应的计数值计数到所述目标值的情况下,在
可执行文件中的第二地址将所述死循环指令替换为所述第二字节指令。
49.可以理解的是,对于上述技术方案中任一计数锁的工作原理可以理解如下:具体参照附图3,以代码指令4之前相邻位置插入的计数锁1为例,计数锁1插入,工具找到计数锁1插入的代码指令行在可执行文件中对应的第二机器码指令,把第二机器码指令的首两字节指令替换成死循环(eb fe)指令,记录第二机器码指令的第二地址和首两字节指令。同步锁插入后,运行可执行文件,运行到计数锁1,执行死循环(eb fe)指令,线程b终止运行,工具确定与计数锁1为同一组同步锁的释放锁1对应的计数值是否计数到0,如果计数到0,则在可执行文件中的第一地址将死循环(eb fe)指令替换回首两字节指令。
50.为了更好的理解上述待运行线程的实现方式,在一个可选实施例中,还提供了一种方案,用于对上述方案进行解释说明。
51.本发明可选实施例提供了一种线程运行方法。该方法包括以下步骤:
52.步骤1:预先在操作平台(例如,可以是linux x86平台)上制作一个控制软件线程按既定时序(可以理解为是上述实施例中的目标运行顺序)运行的工具,制作成功后的工具需要具备以下特征:可以读取程序代码中的调试信息,解析可执行文件的内容;可以显示源代码;可以提供一种线程同步锁机制。
53.具体的,同步锁分为第一同步锁和第二同步锁,依据其实际起到的作用,以下将第一同步锁简称为释放锁,第二同步锁简称为计数锁。释放锁与计数锁是对应存在的,释放锁与计数锁是多对一的关系,也可以一对一的关系,释放锁的数量和计数锁的计数初始值相等。
54.步骤2:使用工具启动可执行文件:依赖linux x86平台和linux系统调用可以获取可执行程序的相关信息。工具启动后可执行文件不会直接运行,这个工具提供输入设置,此时用户可以在源代码任意位置添加或删除释放锁和计数锁,添加计数锁时要指定其计数初始值。
55.步骤3:在确定了既定时序后,可以按照该既定时序在多个源代码(相当于上述实施例的代码指令)中插入同步锁:
56.在某一行源代码的位置加释放锁,工具会找到这行源代码对应的机器码指令在可执行文件中的第一地址,将该机器码指令的第一字节指令(即首字节指令)替换成软中断(int3)指令,并记录所述第一地址,与插入的释放锁对应,保存第一地址被替换的原始指令。
57.在某一行源代码的位置加计数锁,工具会找到这行源代码对应的机器码指令在可执行文件的第二地址,将该机器码指令的第二字节指令,即首两字节指令,替换成死循环(eb fe)指令,并记录所述第二地址,与插入的计数锁对应,保存第二地址被替换的原始指令。
58.可选地,本发明可选实施例中解析可执行文件的方式可以是:基于linux x86平台,只能解析elf格式的可执行文件,可以利用三方开源库binutils解析elf格式的文件,binutils库通过读取解析elf文件的各种接口,从而获取每一行源代码对应的机器码指令在可执行文件中的位置。
59.步骤4:输入命令运行可执行文件:
60.当可执行文件运行到插入释放锁的位置,执行替换后的软中断(int3)指令,可执
行文件将暂停运行并发送一个信号给工具,工具根据发生中断的可执行文件的地址找到释放锁。因为这个地址对应的插入的同步锁是释放锁,将其对应的计数锁的计数值减一,如果该计数锁的计数值到了目标值,查找该计数锁在可执行文件中的地址,将该地址对应位置的死循环(eb fe)指令替换回原先保存的原始指令,即计数锁插入的行源代码对应的机器码指令的首两字节指令,使其所在线程继续运行,计数值将恢复到初始值;否则不进行指令替换,保持原样。然后回到释放锁在可执行文件中的地址将软中断(int3)指令替换成原先保存的原始指令,即释放锁插入的行源代码对应的机器码指令的首字节指令,使其所在线程继续运行。
61.当可执行文件运行到插入计数锁的位置,如果检测到计数锁的当前计数值不为目标值,则执行替换后的死循环(eb fe)指令,插入该计数锁的行源代码所在的线程将不再继续运行。
62.以下提供可选实施例对上述方案进一步进行解释说明:
63.假设可执行文件存在两个线程,分别为线程a和线程b。线程a需要依次运行代码指令1、代码指令2、代码指令3,线程b需要依次运行代码指令4、代码指令5、代码指令6。
64.现在确定需要按照代码指令1、代码指令4、代码指令2、代码指令5、代码指令3、代码指令6的顺序运行。
65.启动工具,设置计数锁可运行目标值为0,插入同步锁:在线程a的代码指令1与指令2之间先插入一把释放锁1,在释放锁1后面的位置插入一把计数锁2,计数初始值设为1;在代码指令2与指令3之间先插入释放锁3,在释放锁3后面的位置插入计数锁4,计数初始值设为1;在代码指令3后面插入释放锁5;
66.在线程b代码指令4之前插入计数锁,计数初始值设为1;在代码指令4与指令5之间先插入释放锁2,在释放锁2后面的位置插入计数锁3,计数初始值设为1;在代码指令5和指令6之间插入释放锁4,在释放锁4后面的位置插入计数锁5,计数初始值设为1,见图3。
67.输入命令运行可执行文件,可执行文件就会按照代码指令1、代码指令4、代码指令2、代码指令5、代码指令3、代码指令6的顺序运行,见图4。
68.通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到根据上述实施例的方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,或者网络设备等)运行本发明各个实施例的方法。
69.图5是根据本发明实施例的一种待运行线程的运行装置的结构框图;如图5所示,包括:
70.确定模块50,用于确定至少两个待运行线程包括的多个代码指令,以及所述多个代码指令的目标运行顺序;
71.处理模块52,用于根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所
述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值,所述n为正整数;
72.运行模块54,用于运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行。
73.通过本发明实施例的上述技术方案,根据多个代码指令对应的目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值;运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行,也就是说,通过在多个代码指令的相邻位置设置同步锁,进而可以控制多个代码指令按照预设的目标运行顺序进行运行,解决了相关技术中,在多线程运行过程中,由于多线程访问资源的运行顺序的无法确定,进而导致资源容易被破坏等问题,进而控制多个代码指令按照预设的目标运行顺序进行运行,使得资源不易被破坏。
74.在一个示例性实施例中,处理模块52,还用于获取多组同步锁,其中,所述多组同步锁中的每一组同步锁均包括:一个或n个第一同步锁,一个第二同步锁;所述第二同步锁的初始计数值为n;将所述多组同步锁按照所述目标运行顺序设置在所述多个代码指令中的每一个代码指令的相邻位置。
75.可以理解的是,在多个代码指令的数量是m个时,获取到的多组同步锁的数量是m-1组,进而根据m-1组同步锁为m个代码指令设置同步锁。具体地,n的取值决定了一组同步锁中第一同步锁的数量,n为正整数,即n可以取值1,2,
……
,n,本发明实施例对此不进行限定。
76.以n取值为1,第一同步锁为释放锁,第二同步锁为计数锁为例,如图3所示,共有5组同步锁,每一组同步锁均包括一个释放锁和一个计数锁。对于上述m个代码指令,由于每个指令在目标执行顺序中的位置是不同的,对于不同位置的代码指令,需采用不同的同步锁的设置方式,具体如下:
77.在一个示例性实施例中,处理模块52,还用于对于所述多个代码指令中首个运行的第一代码指令,在所述第一代码指令之后的相邻位置设置一个或多个第一同步锁,并将与该一个或多个第一同步锁为同一组同步锁的第二同步锁设置在第二代码指令之前的相邻位置,其中,所述第二代码指令为所述目标运行顺序所指示的所述第一代码指令之后的代码指令。
78.以图4为例,图4显示了对于代码指令1-代码指令6,想要确定的目标执行顺序代码指令1-代码指令4-代码指令2-代码指令5-代码指令3-代码指令6。对于第一代码指令(即附图3-4中的代码指令1),在代码指令1之后的位置设置释放锁1,并将与释放锁1在一组同步锁的计数锁1设置在代码指令4之前的位置上。
79.在一个示例性实施例中,处理模块52,还用于对于所述多个代码指令中的中间运行的第三代码指令,在所述第三代码指令之前的相邻位置设置第二同步锁,在所述第三代码指令之后的相邻位置设置一个或多个第一同步锁;其中,在所述第三代码指令之前的相邻位置设置的第二同步锁与第四代码指令之后的相邻位置设置的一个或多个第一同步锁为同一组同步锁,在所述第三代码指令之后的相邻位置设置的一个或多个第一同步锁,与
第五代码指令之前的相邻位置设置的第二同步锁为同一组同步锁,所述第四代码指令为所述目标运行顺序所指示的所述第三代码指令之前的代码指令,所述第五代码指令为所述目标运行顺序所指示的所述第三代码指令之后的代码指令。
80.具体参见附图4,代码指令4、代码指令2、代码指令5和代码指令3均可以理解为是中间运行的第三代码指令,即第三代码指令很可能为多个。以代码指令5为例,在代码指令5之前的位置设置计数锁3,在代码指令5之后的位置设置释放锁4,与计数锁3在同一组同步锁的释放锁3放置在代码指令2之后的位置,与释放锁4在同一组同步锁的计数锁4设置在代码指令3之前的位置。
81.在一个示例性实施例中,处理模块52,还用于对于所述多个代码指令中最后运行的第六代码指令,在所述第六代码指令之前的相邻位置设置第二同步锁,并将与该第二同步锁为同一组同步锁的一个或多个第一同步锁设置在第七代码指令之后的相邻位置,其中,所述第七代码指令为所述目标运行顺序所指示的所述第六代码指令之前的代码指令。
82.具体参见附图4,代码指令6为多个代码指令中最后执行的代码指令,在代码指令6之前的位置设置计数锁5,与计数锁5在同一组同步锁的释放锁5设置在代码指令3之后的位置上。
83.基于上述同步锁的设置方式,具体参照附图3,在执行代码指令1之后,执行一次释放锁1,计数锁1的计数值由于释放锁1被执行一次,因此计数值由1变为0(相当于上述实施例中的目标值),由于计数锁1的计数值已为0,即允许执行计数锁1后的代码指令,因此,在执行释放锁1以后,执行计数锁1,进而计数锁1后的执行代码4。在执行完代码指令4以后,执行释放锁2,同理,在执行计数锁2,由于计数锁2的计数值已为0,因此,可以执行计数锁2后的代码指令2。以此类推,依次执行代码指令5,代码指令3和代码指令6。
84.在一个示例性实施例中,处理模块52,还用于对于所述一组同步锁中的第一同步锁,确定任一第一同步锁所在的行源代码所对应的第一机器码指令;将所述第一机器码指令中的第一字节指令替换为中断指令,并记录所述机器码指令在可执行文件中的第一地址以及所述第一字节指令。
85.在一个示例性实施例中,处理模块52,还用于在执行到所述任一第一同步锁的情况下,执行所述中断指令,以指示所述至少两个待运行线程暂停运行;在可执行文件中的第一地址将中断指令替换为所述第一字节指令。
86.具体参照附图3,以代码指令1之后相邻位置插入的释放锁1为例,释放锁1插入到代码指令1之后相邻位置后,工具找到释放锁1插入的代码指令行在可执行文件中对应的第一机器码指令,把第一机器码指令的首字节指令替换成软中断(int3)指令,记录第一机器码指令的第一地址和首字节指令。同步锁插入后,运行可执行文件,运行到释放锁1,执行软中断(int3)指令,线程a暂停运行,在可执行文件中的第一地址将软中断(int3)指令替换回首字节指令。
87.在一个示例性实施例中,处理模块52,还用于对于所述一组同步锁中的第二同步锁,确定任一第二同步锁所在的行源代码所对应的第二机器码指令;将所述第二机器码指令种的第二字节指令替换为死循环指令,并记录所述机器码指令在可执行文件中的第二地址以及所述第二字节指令。
88.在一个示例性实施例中,处理模块52,还用于在执行到所述任一第二同步锁的情
况下,执行所述死循环指令,以指示所述至少两个待运行线程终止运行;确定与所述任一第二同步锁为同一组同步锁的一个或多个第一同步锁对应的计数值是否计数到目标值;在与所述任一第二同步锁为同一组同步锁的一个或多个第一同步锁对应的计数值计数到所述目标值的情况下,在可执行文件中的第二地址将所述死循环指令替换为所述第二字节指令。
89.具体参照附图3,以代码指令4之前相邻位置插入的计数锁1为例,计数锁1插入,工具找到计数锁1插入的代码指令行在可执行文件中对应的第二机器码指令,把第二机器码指令的首两字节指令替换成死循环(eb fe)指令,记录第二机器码指令的第二地址和首两字节指令。同步锁插入后,运行可执行文件,运行到计数锁1,执行死循环(eb fe)指令,线程b终止运行,工具确定与计数锁1为同一组同步锁的释放锁1对应的计数值是否计数到0,如果计数到0,则在可执行文件中的第一地址将死循环(eb fe)指令替换回首两字节指令。
90.本发明的实施例还提供了一种存储介质,该存储介质包括存储的程序,其中,上述程序运行时运行上述任一项的方法。
91.可选地,在本实施例中,上述存储介质可以被设置为存储用于运行以下步骤的程序代码:
92.s1,确定至少两个待运行线程包括的多个代码指令,以及所述多个代码指令的目标运行顺序;
93.s2,根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁之后的代码指令,所述目标值为所述计数值减去n后的值,所述n为正整数;
94.s3,运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行。
95.在一个示例性实施例中,上述计算机可读存储介质可以包括但不限于:u盘、只读存储器(read-only memory,简称为rom)、随机存取存储器(random access memory,简称为ram)、移动硬盘、磁碟或者光盘等各种可以存储计算机程序的介质。
96.本实施例中的具体示例可以参考上述实施例及示例性实施方式中所描述的示例,本实施例在此不再赘述。
97.本发明的实施例还提供了一种电子装置,包括存储器和处理器,该存储器中存储有计算机程序,该处理器被设置为运行计算机程序以运行上述任一项方法实施例中的步骤。
98.可选地,在本实施例中,上述处理器可以被设置为通过计算机程序运行以下步骤:
99.s1,确定至少两个待运行线程包括的多个代码指令,以及所述多个代码指令的目标运行顺序;
100.s2,根据所述目标运行顺序为所述多个代码指令中的每一个代码指令均设置一组同步锁,并将所述一组同步锁插入到所述每一个代码指令的相邻位置,其中,所述一组同步锁包括以下至少之一:第一同步锁,第二同步锁;运行n个第一同步锁后,所述第二同步锁的计数值减去n,且在所述第二同步锁的计数值为目标值的情况下,允许运行所述第二同步锁
之后的代码指令,所述目标值为所述计数值减去n后的值,所述n为正整数;
101.s3,运行已插入多组所述同步锁的至少两个待运行线程,以使所述多个代码指令按照所述目标运行顺序运行。
102.可选地,上述电子装置还可以包括传输设备以及输入输出设备,其中,该传输设备和上述处理器连接,该输入输出设备和上述处理器连接。
103.可选地,本实施例中的具体示例可以参考上述实施例及可选实施方式中所描述的示例,本实施例在此不再赘述。
104.显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算系统来实现,它们可以集中在单个的计算系统上,或者分布在多个计算系统所组成的网络上,可选地,它们可以用计算系统可运行的程序代码来实现,从而,可以将它们存储在存储系统中由计算系统来运行,并且在某些情况下,可以以不同于此处的顺序运行所示出或描述的步骤,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
105.以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。