pthread库多线程C程序到MSVL程序的转换方法、计算机程序与流程

文档序号:17924500发布日期:2019-06-15 00:19阅读:198来源:国知局
pthread库多线程C程序到MSVL程序的转换方法、计算机程序与流程

本发明属于计算机软件技术领域,尤其涉及一种pthread库多线程c程序到msvl程序的转换方法、计算机程序。



背景技术:

目前,业内常用的现有技术是这样的:近年来,随着互联网的发展,多线程程序已经广泛应用于各类网络软件中。然而,网络软件并发性的特点使得多线程程序在执行时会产生访问错误以及安全性问题,为多线程程序的验证带来了巨大的挑战。虽然传统测试仍然是程序验证的主流方法,但由于其只能选取一些典型的数据作为输入对系统进行验证,这种局限性使得多线程程序在验证时的准确性较低。形式化方法的优势在于用严密的数学理论对待验证系统进行建模和验证,已经广泛应用于多线程程序验证中。

模型检测与定理证明是当前两种主流的形式化验证方法。模型检测方法在验证时首先需要使用有穷状态转换系统对待验证系统进行建模,并使用时序逻辑公式描述系统期望的性质,然后用算法穷尽遍历系统的状态以检测性质是否成立,当性质不成立时,模型检测能提供反例以便于错误定位,如petri网就是一种描述系统元素的异步并发操作的工作模型,可以自然描述并发、冲突、资源争用等系统特性,但是这种方法对于信号量的表达能力有限。定理证明则建立在证明理论的基础上,验证时首先提取系统的模型并表示为逻辑的命题,提取待验证的性质为定理,然后在验证者的引导下,不断对公理和已证明的定理应用推理规则来产生新的定理,该方法可以对线程库进行验证,但该方法的缺点是不能由计算机自动完成,需要验证者辅助进行定理推导。

综上所述,现有技术存在的问题是:现有针对pthread库多线程c程序验证方法的限制较多,表达能力有限,如使用petri网进行建模时过程复杂,同时该方法对于信号量的表达能力有限。解决这类问题的难度在于找到一种合适的方法来等价表示原始程序的语义。同时,解决这一难题对于促进模型检测在工业界的推广具有重要意义。



技术实现要素:

针对现有技术存在的问题,本发明提供了一种pthread库多线程c程序到msvl程序的转换方法、计算机程序。

本发明是这样实现的,一种pthread库多线程c程序到msvl程序的转换方法,所述pthread库多线程c程序到msvl程序的转换方法包括对pthread库多线程c程序进行静态分析,得到程序的层次语法图;将pthread库多线程c程序通过给出的规则转换为语义等价的msvl程序;

所述pthread库多线程c程序到msvl程序的转换方法具体包括以下步骤:

第一步:对pthread库多线程c程序进行预处理,通过词法及语法静态分析的方式得到程序的层次语法图,同时从层次语法图中获得线程信息及信号量信息;得线程信息包含线程标识以及线程入口函数名;信号量信息包含信号量名以及使用该信号量的线程入口函数名集合;

第二步:将pthread库多线程c程序转换成msvl程序,包括pthread库多线程c程序与msvl程序之间的数据类型转换规则、表达式转换规则、语句转换规则、普通函数转换规则、线程函数转换规则、信号量转换规则。

进一步,所述pthread库多线程c程序到msvl程序的线程函数转换规则为:

规则r1:对于c程序中的线程标识符定义语句pthread_tvar,在msvl中将pthread_t类型转换为unsignedint类型,即将c语句pthread_tvar转换为msvl变量定义语句unsignedintvar;

规则r2:对于c程序中的线程函数定义语句void*fun(void*var){...(c_type)var…;s;returne;},首先按照普通函数的转换规则进行处理,然后再处理下面3点:(1)寻找形参var的强制转换类型c_type,在msvl函数的形参中用相应的类型进行替换;(2)设置int类型的变量tid作为函数的第一个形参;(3)通过and操作符将语句termi(_exit)和msvl线程函数中的其它语句连接在一起;根据以上叙述,应将函数调用语句转换为msvl语句functionfun(unsignedinttid,m_typevar,m_typervalue){termi(_exit)and(s2msvl(s);rvalue:=e2msvl(e))},其中c_type为任意的c语言数据类型,m_type表示对应的msvl类型,函数e2msvl用于按照所述表达式转换规则将表达式e转换为msvl的表达式,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

规则r3:对于c程序中的线程创建语句pthread_create(tidp,attr,start_rtn,arg),按照下面三步进行处理:(1)通过转换算法为每个线程标识符分配编号:设置一个unsignedint类型的全局变量thread_id,并赋初值为1;每创建一个线程,将thread_id的值加1并赋值给线程标识符;(2)将线程创建语句转换为msvl中的函数调用:这里将pthread_create函数的第三参数作为函数名称,第四参数arg、第一参数线程id的地址&tidp以及返回值retval作为函数的实参;(3)使用msvl的并行运算符||来实现并行化;根据以上3步,应将语句pthread_create(tidp,attr,start_rtn,arg);s转换为msvl语句(thread_id:=thread_id+1;var:=thread_id)and(start_rtn(arg,&tidp,retval)||s2msvl(s),其中,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

规则r4:在msvl中引入一个专用原子命题_exit,并将其定义为全局变量bool_exit,赋初值为false,同时将语句_exit=true添加在主函数的末尾,即将c程序voidmain(){s}转换为functionmain(){s2msvl(s)_exit=true},其中,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

规则r5:语句pthread_join(var,&retval)转换为msvl中的await(var=0),用于等待线程结束。

进一步,所述信号量转换规则为:

规则r6:c语言中的信号量类型sem_t转换为msvl中的semaphore(n)类型,其中n为c程序中访问信号量的最大线程个数;

规则r7:对于c语言中的信号量操作语句sem_wait(&var)和sem_post(&var),将函数名称转换为msvl对应的sem_require和sem_release,同时将所在线程的标识id值作为调用信号量操作函数的第二个实参,即分别转换为msvl语句为sem_require(&var,id)和sem_release(&var,id)。

本发明的另一目的在于提供一种执行所述pthread库多线程c程序到msvl程序的转换方法的pthread库多线程c程序到msvl程序的转换系统,所述pthread库多线程c程序到msvl程序的转换系统包括:

预处理模块,用于将pthread库多线程c程序信息包含到层次语法图中;

转换msvl模块,用于按照所述转换规则将c程序层次语法图转换为msvl程序层次语法图,并对msvl程序的层次语法图节点逐个处理,直至所有节点都处理完毕。

本发明的另一目的在于提供一种实现所述pthread库多线程c程序到msvl程序的转换方法的计算机程序。

本发明的另一目的在于提供一种实现所述pthread库多线程c程序到msvl程序的转换方法的信息数据处理终端。

本发明的另一目的在于提供一种计算机可读存储介质,包括指令,当其在计算机上运行时,使得计算机执行所述的pthread库多线程c程序到msvl程序的转换方法。

综上所述,本发明的优点及积极效果为:本发明的预处理模块,采用编译原理思想,构造出基于pthread库多线程c程序的层次语法图,该层次语法图包含pthread库多线程c程序的所有信息。本发明的转换msvl模块,通过转换规则,基于预处理模块得到的c程序的层次语法图,构造出msvl程序的层次语法图,并对比pthread库多线程c程序语法和msvl程序语法的差异,基于msvl程序的层次语法图,提出上文中所述数据类型、表达式、语句、普通函数、线程函数、信号量的转换和处理规则。

相对于现有技术,本发明可以实现pthread库多线程c程序到msvl程序的转换,得到可以验证的msvl模型,用形式化方法对其进行验证,保证pthread库多线程c程序的有效性和可靠性。本发明提升了工作效率,促进了模型检测技术在学术界和工业界的推广。

附图说明

图1是本发明实施例提供的pthread库多线程c程序到msvl程序的转换方法流程图。

图2是本发明实施例提供的pthread库多线程c程序到msvl程序的转换方法实现流程图。

图3是本发明实施例提供的pthread库多线程c程序到msvl程序转换系统的结构示意图。

图4是本发明实施例提供的对pthread库多线程c程序提出的层次语法图结构图。

图5是本发明实施例提供的生产者-消费者问题中producer线程的c程序层次语法图示意图。

图6是本发明实施例提供的生产者-消费者问题中producer线程的msvl程序层次语法图示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

针对现有pthread库多线程c程序验证方法的限制较多,表达能力有限,验证时的效率较低的问题。本发明采用pthread库多线程c程序到msvl(modeling,simulation,andverificationlanguage)程序的转换方法。msvl语言的优势在于集系统建模、仿真和验证于一体,可用于描述系统的顺序、选择、循环、并发、同步和信号量等特征,同时可以满足并发及分布式系统的建模需求。遵循posix标准,pthread库定义了线程创建、销毁、同步等函数,本发明主要针对pthread库中的pthread_create函数和pthread_join函数进行处理。

下面结合附图对本发明的应用原理作详细的描述。

如图1所示,本发明实施例提供的pthread库多线程c程序到msvl程序的转换方法包括以下步骤:

s101:对pthread库多线程c程序进行预处理,通过词法及语法静态分析的方式得到程序的层次语法图,同时从层次语法图中获得线程信息(包含线程标识以及线程入口函数名)及信号量信息(包含信号量名以及使用该信号量的线程入口函数名集合);

s102:将pthread库多线程c程序转换成msvl程序,包括pthread库多线程c程序与msvl程序之间的数据类型转换规则、表达式转换规则、语句转换规则、普通函数转换规则、线程函数转换规则、信号量转换规则。

下面结合附图对本发明的应用原理作进一步的描述。

msvl语言是一种逻辑程序设计语言,其优势在于集系统建模、仿真和验证于一体,可用于描述系统的顺序、选择、循环、并发、同步和信号量等特征,同时可以满足并发及分布式系统的建模需求。

如图2示,本发明实施例提供的pthread库多线程c程序到msvl程序的转换方法包括以下步骤:

第一步:对pthread库多线程c程序进行预处理,通过词法及语法静态分析的方式得到程序的层次语法图,同时从层次语法图中获得线程信息(包含线程标识以及线程入口函数名)及信号量信息(包含信号量名以及使用该信号量的线程入口函数名集合),层次语法图的结构如图4所示;

第二步:将第一步的结果输入到转换msvl模块中,转换过程包括:pthread库多线程c程序与msvl程序之间的数据类型转换规则、表达式转换规则、语句转换规则、普通函数转换规则、全局变量处理规则、线程函数转换规则、信号量转换规则。

基本类型转换规则如下:

如果数据类型为char,转换为msvl类型为char;

如果数据类型为long、int或short,转换为msvl类型为int;

如果数据类型为float或double,转换为msvl类型为float;

如果数据类型为[],转换为msvl类型为[];

如果数据类型为c_type*,转换为msvl类型为m_type*,其中c_type(包括带有下标的形式)为任意的c语言数据类型,m_type(包括带有下标的形式)表示对应的msvl类型。

如果数据类型为structsname{c_type1mem1;…;c_typenmemn;},转换为msvl类型为structsname{m_type1mem1and…andm_typenmemn;},其中c_typei(1≤i≤n)(包括带有下标的形式)为任意的c语言数据类型,m_typei(1≤i≤n)(包括带有下标的形式)表示对应的msvl类型。

表达式转换规则如下:

如果表达式为x[+|-|*|/|%|!=|==|>|<]y,转换为msvl表达式为x[+|-|*|/|%|!=|=|>|<]y;

如果表达式为b1&&b2,转换为msvl表达式为b1andb2;

如果表达式为b1||b2,转换为msvl表达式为b1orb2;

如果表达式为!x,转换为msvl表达式为!x。

语句转换规则如下:

如果语句为c_typex;…//x作用域,转换为msvl语句为frame(x)andm_typexand{…//x作用域},其中c_type(包括带有下标的形式)为任意的c语言数据类型,m_type(包括带有下标的形式)表示对应的msvl类型。

如果语句为x=e,转换为msvl语句为x:=e2msvl(e),其中,函数e2msvl用于按照所述表达式转换规则将表达式e转换为msvl的表达式;

如果语句为s1;s2,转换为msvl语句为s2msvl(s1);s2msvl(s2),其中,函数s2msvl用于按照语句转换规则将子语句s(s1/s2)递归转换为msvl的语句。

如果语句为if(b){s1}else{s2},转换为msvl语句为if(e2msvl(b))then{s2msvl(s1)}else{s2msvl(s2)},其中,函数e2msvl用于按照所述表达式转换规则将表达式b转换为msvl的表达式,函数s2msvl用于按照语句转换规则将子语句s(s1/s2)递归转换为msvl的语句;

如果语句为while(b){s1},转换为msvl语句为while(e2msvl(b)){s2msvl(s1)},其中,函数e2msvl用于按照所述表达式转换规则将表达式b转换为msvl的表达式,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句。

普通函数转换规则如下:

如果函数不存在返回值,语句为voidfunc(c_type1var1,...,c_typenvarn){s;},转换为msvl语句为functionfunc(m_type1var1,...,m_typenvarn){s2msvl(s)},其中c_typei(1≤i≤n)(包括带有下标的形式)为任意的c语言数据类型,m_typei(1≤i≤n)(包括带有下标的形式)表示对应的msvl类型,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

如果函数存在返回值,语句为c_typefunc(c_type1var1,…,c_typenvarn){s1;returne;s2},转换为msvl语句为functionfunc(m_type1var1,…,m_typenvarn,m_typervalue){s2msvl(s1);rvalue:=e2msvl(e);s2msvl(s2)},其中c_typei(1≤i≤n)(包括带有下标的形式)为任意的c语言数据类型,m_typei(1≤i≤n)(包括带有下标的形式)表示对应的msvl类型,函数e2msvl用于按照所述表达式转换规则将表达式e转换为msvl的表达式,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句。

线程函数转换规则如下:

规则r1:对于c程序中的线程标识符定义语句pthread_tvar,在msvl中将pthread_t类型转换为unsignedint类型,即将c语句pthread_tvar转换为msvl变量定义语句unsignedintvar;

规则r2:对于c程序中的线程函数定义语句void*fun(void*var){...(c_type)var…;s;returne;},首先按照普通函数的转换规则进行处理,然后再处理下面3点:(1)寻找形参var的强制转换类型c_type,在msvl函数的形参中用相应的类型进行替换;(2)设置int类型的变量tid作为函数的第一个形参;(3)通过and操作符将语句termi(_exit)和msvl线程函数中的其它语句连接在一起;根据以上叙述,应将函数调用语句转换为msvl语句functionfun(unsignedinttid,m_typevar,m_typervalue){termi(_exit)and(s2msvl(s);rvalue:=e2msvl(e))},其中c_type为任意的c语言数据类型,m_type表示对应的msvl类型,函数e2msvl用于按照所述表达式转换规则将表达式e转换为msvl的表达式,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

规则r3:对于c程序中的线程创建语句pthread_create(tidp,attr,start_rtn,arg),按照下面三步进行处理:(1)通过转换算法为每个线程标识符分配编号:设置一个unsignedint类型的全局变量thread_id,并赋初值为1;每创建一个线程,将thread_id的值加1并赋值给线程标识符;(2)将线程创建语句转换为msvl中的函数调用:这里将pthread_create函数的第三参数作为函数名称,第四参数arg、第一参数线程id的地址&tidp以及返回值retval作为函数的实参;(3)使用msvl的并行运算符||来实现并行化;根据以上3步,应将语句pthread_create(tidp,attr,start_rtn,arg);s转换为msvl语句(thread_id:=thread_id+1;var:=thread_id)and(start_rtn(arg,&tidp,retval)||s2msvl(s),其中,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

规则r4:在msvl中引入一个专用原子命题_exit,并将其定义为全局变量bool_exit,赋初值为false,同时将语句_exit=true添加在主函数的末尾,即将c程序voidmain(){s}转换为functionmain(){s2msvl(s)_exit=true},其中,函数s2msvl用于按照语句转换规则将子语句s1递归转换为msvl的语句;

规则r5:语句pthread_join(var,&retval)转换为msvl中的await(var=0),用于等待线程结束。

信号量转换规则如下:

规则r6:c语言中的信号量类型sem_t转换为msvl中的semaphore(n)类型,其中n为c程序中访问信号量的最大线程个数;

规则r7:对于c语言中的信号量操作语句sem_wait(&var)和sem_post(&var),将函数名称转换为msvl对应的sem_require和sem_release,同时将所在线程的标识id值作为调用信号量操作函数的第二个实参,即分别转换为msvl语句为sem_require(&var,id)和sem_release(&var,id)。

如图3所示,本发明提供的pthread库多线程c程序到msvl程序的转换系统,所述pthread库多线程c程序到msvl程序的转换系统包括:

预处理模块,用于将pthread库多线程c程序信息包含到层次语法图中;

转换msvl模块,用于按照所述转换规则将c程序层次语法图转换为msvl程序层次语法图,并对msvl程序的层次语法图节点逐个处理,直至所有节点都处理完毕。

下面结合实施例对本发明的应用效果作详细描述。

以下通过实施例对本发明的执行过程进行展示说明,该实施例只是对本发明过程的说明,只给出执行过程的核心部分,其余类似过程不再给出。该实施例是对生产者-消费者问题的pthread库c程序进行转换,该问题的pthread库c程序如下所示:

具体步骤如下:

首先对该程序进行静态分析,得到的生产者producer函数的c程序层次语法图如图5所示。从c程序的层次语法图中可以分析得出该程序共有两个线程producer和consumer和三个信号量semspace、semprod和sembuf,同时程序中访问信号量的最大线程数为2。

然后,根据c程序层次语法图和上文所述转换规则得到msvl程序层次语法图,msvl层次语法图如图6所示。与此同时,根据msvl程序层次语法图的得到msvl程序如下:

下面对程序中的关键语句进行具体说明(说明前的序号代表代码行号):

1:由静态分析的结果可知程序中访问信号量的最大线程数为2,因此根据规则r6,将c程序中的sem_t类型转换为msvl程序中的semaphore(2)类型;

4:由于该语句是线程函数定义语句,因此在转换成msvl程序时,需要根据规则r2将其转换为msvl程序的函数,并添加unsignedint类型的变量id作为形参;

5:由于该函数是线程函数,因此在转换成msvl程序时,需要根据规则r2将语句termi(_exit)和其它的msvl语句通过and操作符连接在一起;

7:由于该语句是信号量操作语句,因此需要根据规则r7,将c程序中对应的函数名称转换为msvl程序中对应的函数名称,同时添加变量id作为实参;

27:由于该语句是线程标识符定义语句,因此需要根据规则r1,将c程序中的pthread_t类型转化为msvl程序中的unsignedint类型;

31:由于在c程序中使用pthread_create语句创建了两个线程producer和consumer,因此需要根据规则r3,将其转换为msvl程序中的函数调用,并添加并行算子||以保证语义一致;

33:为了表示主函数的结束,需要根据规则r4,需要将语句_exit=true添加在msvl程序中main函数的末尾;

35:由于c程序中的_exit是全局变量,因此需要根据全局变量的处理规则,将c程序中的_exit转换为msvl程序中的框架变量,并同时赋初值。

以上实施例展示了本发明在pthread库多线程c程序到msvl程序转换的基本过程,msvl语言集系统建模、仿真和验证于一体,可以满足并发及分布式系统的建模需求。本发明提升了工作效率,促进了模型检测技术在学术界和工业界的推广。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用全部或部分地以计算机程序产品的形式实现,所述计算机程序产品包括一个或多个计算机指令。在计算机上加载或执行所述计算机程序指令时,全部或部分地产生按照本发明实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、或者其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(dsl)或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输)。所述计算机可读取存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,dvd)、或者半导体介质(例如固态硬盘solidstatedisk(ssd))等。

以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1