CN104679484B - 一种并发分析方法及装置 - Google Patents
一种并发分析方法及装置 Download PDFInfo
- Publication number
- CN104679484B CN104679484B CN201310617816.4A CN201310617816A CN104679484B CN 104679484 B CN104679484 B CN 104679484B CN 201310617816 A CN201310617816 A CN 201310617816A CN 104679484 B CN104679484 B CN 104679484B
- Authority
- CN
- China
- Prior art keywords
- node
- thread
- concurrent
- present
- termination
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- User Interface Of Digital Computer (AREA)
- Data Exchanges In Wide-Area Networks (AREA)
Abstract
本发明公开了一种并发分析方法及装置,包括:获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为所述线程创建节点所创建的线程的开始节点的直接前驱节点,计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,初始化程序控制流图的首节点的并发节点集合,从程序控制流图的首节点开始向下遍历,在遍历过程中,根据继承规则计算出遍历到的每个节点的并发节点集合,由于一次遍历即得到每个节点的并发节点集合,运算简单且运算量小,实现了提高并发分析效率的目的。
Description
技术领域
本发明涉及程序分析领域,特别涉及一种并发分析方法及装置。
背景技术
可能并发分析是程序分析中常见的分析类型,其主要分析程序中可能并行执行的程序语句。分析出程序中可能并行执行的程序语句对程序的优化、并发错误的检测等均具有重要意义。
目前,使用得最为广泛的可能并发分析算法是基于迭代数据流的算法。该算法需要预先根据并发程序中一些关键字定义一套数据流方程,将程序控制流图中的节点以工作集的形式保存,其中,程序控制流图中的一个节点对应程序中的一条程序语句。在分析过程中,逐个从工作集中取出节点,输入数据流方程中进行迭代,计算出有可能与取出的节点并发的节点。
由于该算法利用数据流方程并仅以节点的并发节点集合是否变化为依据,迭代地计算每个节点的并发节点集合,导致大量节点被重复访问和计算,计算控制复杂,运算量大。
发明内容
有鉴于此,本发明实施例的主要目的在于提供一种并发分析方法及装置以实现提高并发分析效率的目的。
为了解决以上技术问题,本发明实施例采取的技术方案是:
第一方面,本发明实施例提供了一种并发分析方法,所述方法包括:
获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为所述线程创建节点所创建的线程的开始节点的直接前驱节点;
计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合;其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点;其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点;其中,线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
初始化所述程序控制流图的首节点的并发节点集合,从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合:
其中,所述继承原则包括:
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去该当前节点的初始无法并发节点集合。
在第一方面的第一种可能的实现方式中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;
所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
结合第一方面的第一种可能的实现方式,在第二种可能的实现方式中,所述每个线程的开始节点的初始并发节点集合中仅包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;
所述每个线程创建节点的直接后继节点的初始并发节点集合中仅包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述当前节点的初始并发节点集合与该当前节点的所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合。
结合第一方面的第一种可能的实现方式,在第三种可能的实现方式中,所述线程终止节点的直接后继节点的初始无法并发节点集合中,仅包括所述线程终止节点所终止的线程的全部节点;
在所述遍历开始之前,还包括:
根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合;
初始化所述程序控制流图的首节点的无法并发节点集合;
在所述遍历过程中,还包括:计算遍历到的每个节点的无法并发节点集合,其中:
如果遍历到的当前节点是线程的开始节点,或者是线程终止节点的直接后继节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合与该当前节点的初始无法并发节点集合的并集,当所述当前节点的直接前驱节点为多个时,所述当前节点的无法并发节点集合等于该当前节点所有直接前驱节点的无法并发节点集合的交集、与所述当前节点的初始无法并发节点集合的并集;
如果遍历到的当前节点是除线程的开始节点以及线程终止节点的直接后继节点以外的节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合,当所述当前节点的直接前驱节点仅为多个时,该当前节点的无法并发节点集合等于该当前节点的所有直接前驱节点的无法并发节点集合的交集。
结合第一方面的第一种可能的实现方式,在第四种可能的实现方式中,所述获取程序控制流图之后,还包括:
获取程序控制流图;
为所述程序控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
为所述程序控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点;
所述计算程序控制流图中每个线程创建节点的直接后继节点的初始并发节点集合具体为计算程序控制流图中每个辅助创建节点的初始并发节点集合;
所述计算程序控制流图中每个线程终止节点的直接后继节点的初始无法并发节点集合具体为计算程序控制流图中每个辅助终止节点的初始无法并发节点集合。
结合第一方面第四种可能的实现方式,在第五种可能的实现方式中,所述计算出程序控制流图中每个线程的开始节点的初始并发节点集合包括:
为每个线程的开始节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的开始节点、以及在整个程序控制流图范围内,所有被对应的开始节点控制的第一节点,其中,所述被对应的开始节点控制的第一节点是指从程序控制流图首节点开始到第一节点自身的路径中必须经过所述对应的开始节点的节点;
针对每个线程的开始节点,分别执行以下第一并发节点计算步骤以计算出每个线程的开始节点的初始并发节点集合,其中,所述第一并发节点计算步骤包括:计算在对应的辅助创建节点之后、与所述对应的辅助创建节点有可达路径的第三节点集合,其中,所述对应的辅助创建节点为所针对的线程的开始节点的直接前驱节点的直接后继节点中的辅助创建节点,根据所针对的线程的开始节点的初始并发节点集合等于所述第三节点集合减去该开始节点对应的局部控制集合,计算出所针对的线程的开始节点的初始并发节点集合。
结合第一方面第五种可能的实现方式,在第六种可能的实现方式中,所述为每个线程的开始节点各对应生成一个局部控制集合包括:
为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
针对每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
为每个线程的开始节点各初始化一个对应的局部控制集合,将每个线程的开始节点,以及在该开始节点所在线程内所有被该开始节点控制的节点加入到对应的局部控制集合中;
针对每个线程的开始节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
结合第一方面第四种可能的实现方式,在第七种可能的实现方式中,所述计算出程序控制流图中每个线程创建节点的直接后继节点的初始并发节点集合包括:
为每个辅助创建节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的辅助创建节点、以及在整个程序控制流图范围内,所有被对应的辅助创建节点控制的第二节点,其中,所述被对应的辅助创建节点控制的第二节点是指从程序控制流图首节点开始到第二节点自身的路径中必须经过所述对应的辅助创建节点的节点;
针对每个辅助创建节点,分别执行以下第二并发节点计算步骤以计算出每个辅助创建节点的初始并发节点集合,其中,所述第二并发节点计算步骤包括:计算在对应的开始节点之后、与所述对应的开始节点有可达路径的第四节点集合,其中,所述对应的开始节点为所针对的辅助创建节点的直接前驱节点的直接后继节点中的开始节点,根据所针对的辅助创建节点的初始并发节点集合等于所述第四节点集合减去该辅助创建节点对应的局部控制集合,计算出所针对的辅助创建节点的初始并发节点集合。
结合第一方面第七种可能的实现方式,在第八种可能的实现方式中,所述为每个辅助创建节点各生成一个对应的局部控制集合包括:
为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
针对每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
为每个辅助创建节点各初始化一个对应的局部控制集合,将每个辅助创建节点,以及在该辅助创建节点所在线程内所有被该辅助创建节点控制的节点加入到对应的局部控制集合中;
针对每个辅助创建节点对应的局部控制集合,分别进入所述第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的结束节点,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
结合第一方面第四种可能的实现方式,在第九种可能的实现方式中,在所述遍历开始之前,还将除了线程的开始节点以及线程创建节点的直接后继节点之外的节点的初始并发节点集合初始化为空集;
所述从程序控制流图的首节点开始向下遍历包括:
将程序控制流图的首节点作为当前节点;
判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点;
如果否且所述当前节点不是程序控制流图的首节点,则将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤,如果否且所述当前节点是程序控制流图的首节点,结束流程;
如果是,访问当前节点的直接后继节点中还未被计算出并发节点集合的直接后继节点;
将当前节点更新为正在被访问的节点;
判断当前节点的直接前驱节点中是否有一个节点未被计算出并发节点集合、且该没有被计算出并发节点集合的节点与当前节点之间的有向边不是循环的回边;
如果是,则将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤;
否则,判断当前节点是否为辅助终止节点;
如果当前节点是辅助终止节点,则,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤;
如果当前节点不是辅助终止节点,则,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的初始并发节点集合与该当前节点的直接前驱节点的并发节点集合的并集,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤。
第二方面,本发明实施例提供了一种并发分析装置,所述装置包括:
获取流图单元,用于获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为该线程创建节点所创建的线程的开始节点的直接前驱节点;
初始计算单元,用于计算所述获取流图单元获取的程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合;其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点;其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点;其中,线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
初始化单元,用于初始化所述程序控制流图的首节点的并发节点集合;
遍历单元,用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合,其中,所述继承原则包括:如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述初始计算单元计算得到的该当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
在第一方面的第一种可能的实现方式中,所述初始计算单元,用于计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中:所计算出的每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;所计算出的每个线程的线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;所计算出的线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程中的全部节点;
所述遍历单元,用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合:其中,所述继承原则包括:
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
结合第二方面的第一种可能的实现方式,在第二种可能的实现方式中,所述初始计算单元,用于计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,所计算出的每个线程的开始节点的初始并发节点集合中仅包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;所计算出的每个线程创建节点的直接后继节点的初始并发节点集合中仅包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
所述遍历单元,用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,计算遍历到的每个节点的并发节点集合,其中:如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述初始计算单元计算得到的当前节点的初始并发节点集合与该当前节点的所有直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
结合第二方面的第一种可能的实现方式,在第三种可能的实现方式中,所述初始计算单元,用于计算出线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述计算出的线程终止节点的直接后继节点的初始无法并发节点集合中,仅包括所述线程终止节点所终止的线程的全部节点;
所述初始计算单元,还用于根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合;
所述初始化单元,还用于初始化所述程序控制流图的首节点的无法并发节点集合;
所述遍历单元,还用于计算遍历到的每个节点的无法并发节点集合,其中:如果遍历到的当前节点是线程的开始节点,或者是线程终止节点的直接后继节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合与所述初始计算单元计算得到的该当前节点的初始无法并发节点集合的并集,当所述当前节点的直接前驱节点为多个时,所述当前节点的无法并发节点集合等于该当前节点所有直接前驱节点的无法并发节点集合的交集、与所述初始计算单元计算得到的当前节点的初始无法并发节点集合的并集;如果遍历到的当前节点是除线程的开始节点以及线程终止节点的直接后继节点以外的节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合,当所述当前节点的直接前驱节点为多个时,该当前节点的无法并发节点集合等于该当前节点的所有直接前驱节点的无法并发节点集合的交集。
结合第二方面的第一种可能的实现方式,在第四种可能的实现方式中,所述获取流图单元包括获取流图子单元,辅助创建节点增加子单元,辅助终止节点增加子单元;
其中,所述获取流图子单元,用于获取各个线程的控制流图;
所述辅助创建节点增加子单元,用于为所述各个线程的控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
所述辅助终止节点增加子单元,用于为所述各个线程的控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点。
结合第二方面第四种可能的实现方式,在第五种可能的实现方式中,所述初始计算单元包括第一局部计算子单元,第一并发计算子单元;
其中,第一局部计算子单元,用于为每个线程的开始节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的开始节点、以及在整个程序控制流图范围内,所有被对应的开始节点控制的第一节点,其中,所述被对应的开始节点控制的第一节点是指从程序控制流图首节点开始到第一节点自身的路径中必须经过所述对应的开始节点的节点;
所述第一并发计算子单元,用于针对每个线程的开始节点,分别执行以下第一并发节点计算步骤以计算出每个线程的开始节点的初始并发节点集合,其中,所述第一并发节点计算步骤包括:计算在对应的辅助创建节点之后、与所述对应的辅助创建节点有可达路径的第三节点集合,其中,所述对应的辅助创建节点为所针对的线程的开始节点的直接前驱节点的直接后继节点中的辅助创建节点,根据所针对的线程的开始节点的初始并发节点集合等于所述第三节点集合减去所述第一局部计算子单元生成的该开始节点对应的局部控制集合,计算出所针对的线程的开始节点的初始并发节点集合。
结合第二方面第五种可能的实现方式,在第六种可能的实现方式中,所述第一局部计算子单元包括第一初始终止子单元、第一追加子单元、第一初始局部子单元,第二追加子单元;
其中,所述第一初始终止子单元,用于为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
所述第一追加子单元,用于针对从所述第一初始终止子单元得到的每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
所述第一初始局部子单元,用于为每个线程的开始节点各初始化一个对应的局部控制集合,将每个线程的开始节点,以及在该开始节点所在线程内所有被该开始节点控制的节点加入到对应的局部控制集合中;
所述第二追加子单元;用于针对从所述第一初始局部子单元得到的每个线程的开始节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断所述第一追加子单元计算得到的该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
结合第二方面第四种可能的实现方式,在第七种可能的实现方式中,所述初始计算单元包括第二局部计算子单元,第二并发计算子单元;
其中,所述第二局部计算子单元,用于为每个辅助创建节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的辅助创建节点、以及在整个程序控制流图范围内,所有被对应的辅助创建节点控制的第二节点,其中,所述被对应的辅助创建节点控制的第二节点是指从程序控制流图首节点开始到第二节点自身的路径中必须经过所述对应的辅助创建节点的节点;
所述第二并发计算子单元,用于针对每个辅助创建节点,分别执行以下第二并发节点计算步骤以计算出每个辅助创建节点的初始并发节点集合,其中,所述第二并发节点计算步骤包括:计算在对应的开始节点之后、与所述对应的开始节点有可达路径的第四节点集合,其中,所述对应的开始节点为所针对的辅助创建节点的直接前驱节点的直接后继节点中的开始节点,根据所针对的辅助创建节点的初始并发节点集合等于所述第四节点集合减去所述第二局部计算子单元生成的该辅助创建节点对应的局部控制集合,计算出所针对的辅助创建节点的初始并发节点集合。
结合第二方面第七种可能的实现方式,在第八种可能的实现方式中,所述第二局部计算子单元包括第二初始终止子单元、第三追加子单元、第二初始局部子单元,第四追加子单元;
其中,所述第二初始终止子单元,用于为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
所述第三追加子单元,用于针对从所述第二初始终止子单元得到的每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
所述第二初始局部子单元,用于为每个辅助创建节点各初始化一个对应的局部控制集合,将每个辅助创建节点,以及在该辅助创建节点所在线程内所有被该辅助创建节点控制的节点加入到对应的局部控制集合中;
所述第四追加子单元,用于针对从所述第二初始局部子单元得到的每个辅助创建节点对应的局部控制集合,分别进入所述第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断所述第三追加子单元计算得到的该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
结合第二方面第四种可能的实现方式,在第九种可能的实现方式中,所述初始化单元,还用于在所述遍历开始之前,将除了线程的开始节点以及线程创建节点的直接后继节点之外的节点的初始并发节点集合初始化为空集;
所述遍历单元包括首节点设置子单元、第一判断子单元、第一返回子单元、结束子单元、访问子单元、节点更新子单元、第二判断子单元、第二返回子单元、第三判断子单元、第一遍历计算子单元,第二遍历计算子单元;
其中,所述首节点设置子单元,用于将程序控制流图的首节点作为当前节点;
所述第一判断子单元,用于判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点;
所述第一返回子单元,用于所述第一判断子单元判断为否且所述当前节点不是程序控制流图的首节点时,将所述当前节点的直接前驱节点作为当前节点,重新触发所述第一判断子单元;
所述结束子单元,用于所述第一判断子单元判断为否且所述当前节点是程序控制流图的首节点时,结束流程;
所述访问子单元,用于所述第一判断子单元判断为是时,访问当前节点的直接后继节点中还未被计算出并发节点集合的直接后继节点;
所述节点更新子单元,用于在所述访问单元访问节点时,将当前节点更新为正在被访问的节点;
所述第二判断子单元,用于在所述节点更新子单元更新后,判断当前节点的直接前驱节点中是否有一个节点未被计算出并发节点集合、且该没有被计算出并发节点集合的节点与当前节点之间的有向边不是循环的回边;
所述第二返回子单元,用于所述第二判断子单元判断为是时,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并重新触发所述第一判断子单元;
所述第三判断子单元,用于所述第二判断子单元判断为否时,判断当前节点是否为辅助终止节点;
所述第一遍历计算子单元,用于所述第三判断子单元判断为是时,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合;
所述第二遍历计算子单元,用于所述第三判断子单元判断为否时,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的初始并发节点集合与该当前节点的直接前驱节点的并发节点集合的并集。
可见本发明具有如下有益效果:
由于本发明所获取的程序控制流图中,线程创建节点为线程创建节点所创建的线程的开始节点的直接前驱节点,因此,各个单个线程拼接形成了完整的程序控制流图,为接下来只需一次遍历即可计算出每个节点的并发节点集合做出了准备,由于在程序控制流图中,线程开始节点、以及线程创建节点的直接后继节点会由于线程的创建产生新的并发节点,线程终止节点的直接后继节点会由于线程的终止产生新的无法并发节点,除了上述线程开始节点、线程创建节点的直接后继节点、线程终止节点以外,其他节点均可以通过继承其直接前驱节点的并发节点集合的并集得到该节点的并发节点集合,因此,本发明实施例首先计算出了程序控制流图中每个线程的开始节点的初始并发节点集合、其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点,计算出了每个线程创建节点的直接后继节点的初始并发节点集合,其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点,以及计算出了每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点,从而在初始化所述程序控制流图的首节点的并发节点集合之后,可以从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,基于继承规则计算遍历到的每个节点的并发节点集合,可见,由于本发明实施例可以一次遍历即计算出程序控制流图中每个节点的并发节点集合,运算简单且运算量小,实现了提高并发分析效率的目的。
附图说明
为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1是本发明实施例提供的一种并发分析方法的流程示意图之一;
图2-1是本发明实施例可能涉及的一种程序控制流图示意图之一;
图2-2是本发明实施例可能涉及的一种程序控制流图示意图之二;
图3是本发明实施例提供的一种并发分析方法的流程示意图之二;
图4是本发明实施例提供的一种并发分析方法的流程示意图之三;
图5是本发明实施例提供的一种并发分析方法的流程示意图之四;
图6是本发明实施例提供的一种并发分析装置的结构示意图之一;
图7是本发明实施例提供的一种并发分析装置的结构示意图之二;
图8是本发明实施例提供的一种并发分析装置的结构示意图之三;
图9是本发明实施例提供的一种并发分析装置的结构示意图之四。
具体实施方式
为使本发明实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图和具体实施方式对本发明实施例作进一步详细的说明。
在对本发明实施例详细介绍之前,为了使本发明实施例提供的方法便于理解,下面先对本发明实施例所涉及的基本概念进行说明:
程序控制流图:是一个过程或程序的抽象表现,是有向图,程序中的每个语句都对应图中的一个节点,如果一个程序包括多个线程,则程序控制流图中可以包括多个线程的控制流图;
线程创建节点:是程序的一个线程中,用于创建另一线程的节点;
线程的开始节点:是程序的一个线程中的第一个程序语句对应的节点;
线程终止节点:是程序的一个线程中,用于以各种语法形式或者函数调用的方式去结束另一个正在执行中的线程的节点;
线程的结束节点:是程序的一个线程中的最后一个程序语句对应的节点;
被控制的节点:在程序控制流图中,如果从流图的起始节点到达某个节点x的过程中必然要经过节点p,那么我们称节点p控制节点x,节点x为被节点p控制的节点。
需要说明的是,一个线程中必然有一个线程的开始节点以及结束节点,可能有也可能没有用于创建另一线程的线程创建节点、以及用于终止正在执行中的另一线程的线程终止节点。
为了实现提高并发分析效率的目的,本发明实施例提出了一次遍历即计算出程序控制流图中每个节点的并发节点的方案。本发明实施例的方案所基于的原理是:线程开始节点、以及线程创建节点的直接后继节点会由于线程的创建产生新的并发节点,线程终止节点的直接后继节点会由于线程的终止产生新的无法并发节点,除了上述线程开始节点、线程创建节点的直接后继节点、线程终止节点的直接后继节点以外,其他节点均可以通过继承其直接前驱节点的并发节点集合的并集得到该节点的并发节点集合。
下面对基于上述原理的本发明实施例提供的一种并发分析方法进行详细介绍:
参见图1,示出了本发明实施例提供的一种并发分析方法的流程示意图之一。如图所示,该实施例可以包括:
S110、获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为所述线程创建节点所创建的线程的开始节点的直接前驱节点;
需要说明的是,由于本发明实施例需要在一次从上到下的遍历过程中通过继承直接前驱节点的并发节点来计算遍历到的每个节点的并发节点集合,因此,如图2-1或图2-2所示,本发明实施例所获取的程序控制流图中,线程创建节点210应为该线程创建节点所创建的线程的开始节点270的直接前驱节点,从而将程序中各个独立的线程拼接成完整的程序控制流图,从程序首节点开始从上到下的遍历的过程中基于上述继承的原理计算出遍历到的每个节点的并发节点集合。
S120、计算程序控制流图中每个线程的开始节点的初始并发节点集合,其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点,
需要说明的是,根据本发明该实施例,所述每个线程的开始节点的初始并发节点集合可以包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,一个或多个,甚至是所有能够与所述开始节点并发的节点,可以根据实施需要变化,在本发明中并不进行限制。
S121、计算程序控制流图中每个线程创建节点的直接后继节点的初始并发节点集合,其中,所述线程创建节点的直接后继节点的并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点;
需要说明的是,根据本发明该实施例,所述每个线程创建节点的直接后继节点的初始并发节点集合可以包括所述线程创建节点所创建的线程的开始节点之后的节点中,一个或多个,甚至是所有能够与所述线程创建节点的直接后继节点并发的节点,可以根据实施需要变化,在本发明中并不进行限制。
S122、计算程序控制流图中每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
需要说明的是,根据本发明该实施例,所述每个线程终止节点的直接后继节点的初始无法并发节点集合可以仅包括所述线程终止节点所终止的线程中的全部的节点,或者,可以包括所有无法与所述线程终止节点的直接后继节点并发的节点,可以根据实施需要变化,在本发明中并不进行限制。
需要说明的是,在本发明实施例中,上述计算出所述开始节点的初始并发节点集合、线程创建节点的直接后继节点的初始并发节点集合、线程终止节点的直接后继节点的初始无法并发节点集合的具体实现方式可以基于现有技术已有的方式,也可以基于将在下面本发明实施例公开的实现方式,在本发明中并不进行限制。但是,无论采用哪种方式,所述开始节点的初始并发节点集合中应用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点,所述线程创建节点的直接后继节点的初始并发节点集合中应包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点,从而在一次遍历的过程中,可以使其后继节点能够通过继承直接得到由于线程创建所产生的并发节点,简单快速地计算出准确的并发节点集合。其中,所述线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点。例如,其中,所述线程终止节点的直接后继节点的初始无法并发节点集合可以包括其在整个程序控制流图内的所有无法并发节点,也可以仅包括所述线程终止节点所终止的线程的全部节点。在仅包括所述线程终止节点所终止的线程的全部节点的实现方式中,可以在遍历的过程中,通过继承其直接前驱节点的无法并发节点集合,对该线程终止节点的直接后继节点的无法并发节点集合进行补充,补充完整的无法并发节点集合可以用来在步骤S170中计算该线程终止节点的直接后继节点的并发节点集合。
S130、初始化所述程序控制流图的首节点的并发节点集合;
在本发明实施例中,所述初始化所述程序控制流图的首节点的并发节点集合可以具体初始化为空集,也可以根据实施需要,将该首节点已知的并发节点加入到该首节点的并发节点集合中,在本发明中并不进行限制。
S140、从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合,其中:
S140.1、如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合的并集;
例如,如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合可以包括该当前节点的1个或多个,甚至是所有直接前驱节点的并发节点集合的并集。
S140.2、如果遍历到的当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;
例如,如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合可以包括所述当前节点的初始并发节点集合与一个或多个,甚至是所有直接前驱节点的并发节点集合的并集;
S140.3、如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去该当前节点的初始无法并发节点集合。
例如,如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的1个或多个,甚至是所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
可见,应用本发明实施例提供的方法,由于所获取的程序控制流图中,线程创建节点为线程创建节点所创建的线程的开始节点的直接前驱节点,各个单个线程拼接形成了完整的程序控制流图,为接下来一次遍历即可计算出每个节点的并发节点集合做出了准备;本发明实施例首先计算出了程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述开始节点的初始并发节点集合中包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点,所述线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程的至少一个节点,从而,可以在初始化所述程序控制流图的首节点的并发节点集合之后,就可以从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据继承规则,计算出遍历到的每个节点的并发节点集合,可见,本发明实施例可以一次遍历即计算出程序控制流图中每个节点的并发节点集合,运算简单且运算量小,实现了提高并发分析效率的目的。
在本发明实施例的一种可能的实现方式中,为了不遗漏任何并发节点,例如:
所述每个线程的开始节点的初始并发节点集合可以包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;
所述线程创建节点的直接后继节点的初始并发节点集合可以包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
所述线程终止节点的直接后继节点的初始无法并发节点集合可以包括所述线程终止节点所终止的线程中的全部节点;
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合可以包括该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合可以包括所述当前节点的初始并发节点集合与所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合可以包括该当前节点的所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
在该实现方式中,由于将所有无法通过继承得到的,线程的开始节点的初始并发节点,线程创建节点的直接后继节点的初始并发节点,以及线程终止节点的直接后继节点的初始无法并发节点,在遍历之前都已经计算出来,因此,所有的并发节点均可在遍历的过程中通过继承其直接前驱节点得到,不会遗漏任何并发节点,准确度很高。
在该实现方式中,还可以有以下两种可能的实现方式:
一种是,如果所述计算出的每个线程的开始节点的初始并发节点集合中仅包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,能够与所述开始节点并发的节点;且,所述计算出的每个线程创建节点的直接后继节点的初始并发节点集合中仅包括所述线程创建节点所创建的线程的开始节点之后的节点中,能够与所述线程创建节点的直接后继节点并发的节点;
则,如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述当前节点的初始并发节点集合与该当前节点的所有直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合。
在该实现方式中,由于仅计算了线程的开始节点的初始并发节点集合、线程创建节点的直接后继节点的初始并发节点集合中至少应包括的部分,后续在遍历的过程中通过继承其直接前驱节点的并发节点集合进行补充,计算量小,效率较高。
另一种是,如果当前节点是线程创建节点的直接后继节点或者开始节点,且当前节点的初始并发节点集合已经包括该当前节点在程序控制流图内的所有并发节点;则,如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述当前节点的初始并发节点集合;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合。
需要说明的是,在本发明实施例中,所述线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程中的至少一个节点,因此,所述线程终止节点的直接后继节点的初始无法并发节点集合可以包括整个程序控制流图范围内所有与该线程终止节点的直接后继节点无法并发的节点集合,也可以仅包括所述线程终止节点所终止的线程的全部节点,或者其他实施方式,在本发明中并不进行限制。下面,对所述线程终止节点的直接后继节点的初始无法并发节点集合仅包括所述线程终止节点所终止的线程的全部节点的实施方式进行详细介绍:
在所述线程终止节点的直接后继节点的初始无法并发节点集合仅包括所述线程终止节点所终止的线程的全部节点的实施方式中,一种可选的方式是在遍历的过程中通过继承其直接前驱节点的无法并发节点集合进行补充。具体地,例如,参见图3,示出了本发明实施例提供的一种并发分析方法的流程示意图之二,如图3所示,可以基于上述如图1所示的实施例,增加以下步骤:
步骤S123、根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合;
步骤S124、初始化所述程序控制流图的首节点的无法并发节点集合;
步骤S141、在所述遍历过程中,计算遍历到的每个节点的无法并发节点集合,其中,
如果遍历到的当前节点是线程的开始节点,或者是线程终止节点的直接后继节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合与该当前节点的初始无法并发节点集合的并集,当所述当前节点的直接前驱节点为多个时,所述当前节点的无法并发节点集合等于该当前节点所有直接前驱节点的无法并发节点集合的交集、与所述当前节点的初始无法并发节点集合的并集;
如果遍历到的当前节点是除线程的开始节点以及线程终止节点的直接后继节点以外的节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合,当所述当前节点的直接前驱节点仅为多个时,该当前节点的无法并发节点集合等于该当前节点的所有直接前驱节点的无法并发节点集合的交集。
需要说明的是,如果当前节点是线程终止节点的直接后继节点,则计算当前节点的无法并发节点集合的步骤一定要在计算并发节点集合之前,以使当前节点所计算出的并发节点集合中一定排除了由于线程终止产生的无法并发节点。对于除了线程终止节点的直接后继节点以外的节点,计算无法并发节点集合与计算并发节点集合的顺序可以互换,不影响计算并发节点集合的结果。另外,计算初始并发节点集合、初始无法并发节点集合或者初始化首节点的并发节点集合以及无法并发节点集合的各个步骤之间也没有必须遵循的顺序,可以进行任意互换。但是,本发明实施例的所述遍历,一定是从上到下的遍历,从而使一个节点的并发节点集合或者无法并发节点集合得以在其直接前驱节点的并发节点集合已经计算得到的情况下进行计算。
可见,应用图3所示本发明实施例,由于该实施例考虑到对于线程终止节点的直接后继节点、以及线程的开始节点来说,其无法并发节点中的一部分可以通过继承其直接前驱节点的无法并发节点集合获得,所以,对于线程终止节点的直接后继节点来说,所述线程终止节点的直接后继节点的初始无法并发节点集合中,可以仅包括所述线程终止节点所终止的线程的全部节点,对于线程的开始节点来说,可以根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合,进而在遍历的过程中,再对其无法并发节点进行补充,与计算出整个程序控制流图范围内所有的无法并发节点相比较,一定程度上减少了计算量,提高了效率。而且,在遍历过程中计算每个节点的无法并发节点集合时,还考虑到如果当前节点的直接前驱节点有多个时,由于程序实际一次执行一般只执行其中一个可能的分支,并不会执行全部,取当前节点的直接前驱节点的无法并发节点集合的交集补充到当前节点的无法并发节点集合中,能够保证所获得的当前其无法并发节点集合达到最小集,所有可能并发的节点一定都将保留在其并发节点集合中,有利于以后对可能并发的节点的相关处理,不会遗漏并发节点。
另外,考虑到程序控制流图中,一个线程创建节点的直接后继节点可能为多个、一个线程终止节点的直接后继节点也可能为多个,为了减少计算量,提高效率,本发明实施例一种可能的实现方式中,在一个线程创建节点与其直接后继节点之间插入一个辅助创建节点、在一个线程终止节点与其直接后继节点之间插入一个辅助终止节点,以减少针对线程创建节点的直接后继节点、以及针对线程终止节点的直接后继节点的计算量。具体地,可以参见图4所示本发明实施例提供的一种并发分析方法的流程示意图之三,如图所示,该实施例可以包括:
S410.1、获取各个线程的控制流图;
例如,可以获取如图2-1所示的两个线程的控制流图,其中,节点210为线程创建节点,节点220-230为该线程创建节点原有的直接后继节点,节点240为线程终止节点,节点250-260为该线程终止节点原有的直接后继节点;
S410.2、为所述各个线程的控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
例如,如图2-2所示,线程创建节点210新增了一个直接后继节点,即辅助创建节点211,该线程创建节点210原有的直接后继节点改为了辅助创建节点211的直接后继节点;
S410.3、为所述各个线程的控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点。
例如,如图2-2所示,线程终止节点240新增了一个直接后继节点,即辅助终止节点241,该线程终止节点240原有的直接后继节点改为了辅助终止节点241的直接后继节点,例如,还可以将线程终止节点所终止的线程的结束节点记为该线程终止节点的直接前驱节点,即,在程序控制流图中创建从线程的结束节点到终止该线程的终止节点的直接后继节点,即辅助终止节点之间的有向边。
S420、计算程序控制流图中每个线程的开始节点的初始并发节点集合;
需要说明的是,在本发明实施例中,计算开始节点的初始并发节点集合的具体实现方式不限。下面给出一种可能的实现方式,例如,可以包括:
为每个线程的开始节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的开始节点、以及在整个程序控制流图范围内,所有被对应的开始节点控制的第一节点,其中,所述被对应的开始节点控制的第一节点是指从程序控制流图首节点开始到第一节点自身的路径中必须经过所述对应的开始节点的特定节点;
例如,如图2-2所示,线程开始节点270的局部控制集合为{BT,F1,FT,AET,ET,M4,M5}
针对每个线程的开始节点,分别执行以下第一并发节点计算步骤以计算出每个线程的开始节点的初始并发节点集合,其中,所述第一并发节点计算步骤包括:计算在对应的辅助创建节点之后、与所述对应的辅助创建节点有可达路径的第三节点集合,其中,所述对应的辅助创建节点为所针对的线程的开始节点的直接前驱节点的直接后继节点中的辅助创建节点,根据所针对的线程的开始节点的初始并发节点集合等于所述第三节点集合减去该开始节点对应的局部控制集合,计算出所针对的线程的开始节点的初始并发节点集合。
例如,如图2-2所示,与开始节点270对应辅助创建节点有可达路径的第三节点集合为{ACT,M1,M2,ET,AET,M4,M5},则开始节点270的初始并发节点集合为{ACT,M1,M2}。
需要说明的是,其中,所述开始节点对应的局部控制集合的具体生成方式不限,在本发明实施例一种可能的实现方式中,可以预先计算出每个开始节点在其所在线程内被其控制的节点的集合,即每个开始节点分别在其所在线程内对应的终止控制集合,再根据线程与线程之间由于终止关系形成的辅助终止节点的终止控制集合被开始节点控制的控制关系,将辅助终止节点的终止控制集合传递到开始节点的终止控制集合中,进而最终可以得到每个开始节点对应的完整的局部控制集合,由于在该实现方式中,针对开始节点以及辅助终止节点在单个线程内的终止控制集合的计算,因此,可以分别进行串行或者并行的计算,再传递到开始节点的局部控制集合中,能够达到提高效率的目的,具体地,例如,所述为每个线程的开始节点各对应生成一个局部控制集合可以包括:
为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
针对每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
为每个线程的开始节点各初始化一个对应的局部控制集合,将每个线程的开始节点,以及在该开始节点所在线程内所有被该开始节点控制的节点加入到对应的局部控制集合中;
针对每个线程的开始节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
S421、计算程序控制流图中每个辅助创建节点的初始并发节点集合;
需要说明的是,在本发明实施例中,计算程序控制流图中每个辅助创建节点的初始并发节点集合的具体实现方式不限。下面给出一种可能的实现方式:与上述为线程的开始节点计算初始并发节点集合的原理类似地,所述计算程序控制流图中每个辅助创建节点的初始并发节点集合可以包括:
为每个辅助创建节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的辅助创建节点、以及在整个程序控制流图范围内,所有被对应的辅助创建节点控制的第二节点,其中,所述被对应的辅助创建节点控制的第二节点是指从程序控制流图首节点开始到第二节点自身的路径中必须经过所述对应的辅助创建节点的节点;
例如,如图2-2所示,辅助创建节点211的局部控制集合为{ACT,M1,M2,ET,AET,M4,M5}
针对每个辅助创建节点,分别执行以下第二并发节点计算步骤以计算出每个辅助创建节点的初始并发节点集合,其中,所述第二并发节点计算步骤包括:计算在对应的开始节点之后、与所述对应的开始节点有可达路径的第四节点集合,其中,所述对应的开始节点为所针对的辅助创建节点的直接前驱节点的直接后继节点中的开始节点,根据所针对的辅助创建节点的初始并发节点集合等于所述第四节点集合减去该辅助创建节点对应的局部控制集合,计算出所针对的辅助创建节点的初始并发节点集合。
例如,如图2-2所示,与辅助创建节点211对应的开始节点270有可达路径的第四节点集合为{BT,F1,FT},则辅助创建节点211的初始并发节点集合为{BT,F1,FT}。
其中,所述辅助创建节点对应的局部控制集合的具体生成方式不限,在本发明实施例一种可能的实现方式中,基于与上述开始节点的局部控制集合计算相同的原理,具体地,例如:
可以为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
针对每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤;
为每个辅助创建节点各初始化一个对应的局部控制集合,将每个辅助创建节点,以及在该辅助创建节点所在线程内所有被该辅助创建节点控制的节点加入到对应的局部控制集合中;
针对每个辅助创建节点对应的局部控制集合,分别进入所述第二追加步骤。
其中,所述第一追加步骤以及第二追加步骤的具体实现方式可以参见前述介绍,在此不再赘述。
S422、计算程序控制流图中每个辅助终止节点的初始无法并发节点集合;
S430、初始化所述程序控制流图的首节点的并发节点集合;
S440、从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,计算遍历到的每个节点的并发节点集合,其中:
S440.1、如果遍历到的当前节点不是辅助终止节点,则,所述当前节点的并发节点集合至少包括该当前节点的所有直接前驱节点的并发节点集合的并集;
S440.2、如果遍历到的当前节点是辅助创建节点或者线程的开始节点,则,所述当前节点的并发节点集合至少包括所述当前节点的初始并发节点集合;
S440.3、如果遍历到的当前节点是辅助终止节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合。
可见,应用图4所示本发明实施例提供的方法,由于增加辅助创建节点以及辅助终止节点,对于一个线程创建节点来说,可以将原本可能针对该线程创建节点的多个直接后继节点的计算化为针对一个辅助创建节点的计算,对于一个线程终止节点来说,可以将原本可能针对线程终止节点的多个直接后继节点的计算化为针对一个辅助终止节点的计算,从而可以减少计算量,提高效率。
在本发明实施例又一种可能的实现方式中,结合上述本发明实施例增加辅助创建节点、辅助终止节点的实现方式,提出了如下的从上到下遍历的具体实现方式。例如,参见图5,示出了本发明实施例提供的一种并发分析方法的流程示意图之五。如图所示,该实施例可以包括:
S510、获取各个线程的控制流图;
S511、为所述各个线程的控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
S512、为所述各个线程的控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点;
S520、计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述每个线程的开始节点的并发节点集合至少包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,能够与所述开始节点并发的节点,其中,所述线程创建节点的直接后继节点的并发节点集合至少包括所述线程创建节点所创建的线程的开始节点之后的节点中,能够与所述线程创建节点的直接后继节点并发的节点,其中,线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
S530、初始化所述程序控制流图的首节点的并发节点集合,将除了线程的开始节点以及线程创建节点的直接后继节点之外的节点的初始并发节点集合初始化为空集;
S540、将程序控制流图的首节点作为当前节点;
S541、判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点;
S542、如果否且所述当前节点不是程序控制流图的首节点,则将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤;
S543、如果否且所述当前节点是程序控制流图的首节点,结束流程;
S544、如果是,访问当前节点的直接后继节点中还被计算出并发节点集合的直接后继节点;
S545、将当前节点更新为正在被访问的节点;
S546、判断当前节点的直接前驱节点中是否有一个节点未被计算出并发节点集合、且该没有被计算出并发节点集合的节点与当前节点之间的有向边不是循环的回边;
S547、如果是,则将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤;
S548、否则,判断当前节点是否为辅助终止节点;
S549、如果当前节点是辅助终止节点,则,所述当前节点的并发节点集合等于该当前节点的直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合;
S550、如果当前节点不是辅助终止节点,则,所述当前节点的并发节点集合等于该当前节点的初始并发节点集合与该当前节点的直接前驱节点的并发节点集合的并集;
S560、将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤。
应用图5所示本发明实施例,由于其遍历过程中在对当前节点的并发节点集合进行计算之前,判断了当前节点的直接前驱节点是否未被计算并发节点集合,因此,可以保证是从上到下的遍历,保证一个节点的无法节点集合在计算之前,能够得到其所有直接前驱节点的已经计算出的并发节点集合,不会遗漏并发节点。
与上述本发明实施例提供的方法相对应的,本发明实施例还提供了一种并发分析装置。参见图6,示出了一种并发分析装置的结构示意图之一,如图所示,该装置可以包括:
获取流图单元610,可以用于获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为所述线程创建节点所创建的线程的开始节点的直接前驱节点;
初始计算单元620,可以用于计算所述获取流图单元获取的程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合;其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点;其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点;其中,线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
初始化单元630,可以用于初始化所述程序控制流图的首节点的并发节点集合;
遍历单元640,可以用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合,其中,所述继承原则包括:如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述初始计算单元计算得到的该当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
应用本发明实施例提供的装置,由于获取流图单元610所获取的程序控制流图中,线程创建节点为线程创建节点所创建的线程的开始节点的直接前驱节点,各个单个线程拼接形成了完整的程序控制流图,为接下来只需一次遍历即可计算出每个节点的并发节点集合做出了准备;初始计算单元620首先计算出了程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,从而,可以在初始化单元630初始化所述程序控制流图的首节点的并发节点集合之后,遍历单元640就可以从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据继承规则计算出遍历到的每个节点的并发节点集合,因此,本发明实施例可以一次遍历即计算出程序控制流图中每个节点的并发节点集合,运算简单且运算量小,实现了提高并发分析效率的目的。
在本发明实施例一种可能的实现方式中,所述初始计算单元620,可以用于计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中:所计算出的每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;所计算出的每个线程的线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;所计算出的线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程中的全部节点;
所述遍历单元640,可以用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合:其中,所述继承原则包括:
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
在该实现方式中,由于将所有无法通过继承得到的,线程的开始节点的初始并发节点,线程创建节点的直接后继节点的初始并发节点,以及线程终止节点的直接后继节点的初始无法并发节点,在遍历之前都已经计算出来,因此,所有的并发节点均可在遍历的过程中通过继承其直接前驱节点得到,不会遗漏任何并发节点,准确度很高。
例如,在该实现方式中,上述遍历单元640可以有以下两种可能的实现方式:
一种是,如果所述计算出的每个线程的开始节点的初始并发节点集合中仅包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,能够与所述开始节点并发的节点;且,所述计算出的每个线程创建节点的直接后继节点的初始并发节点集合中仅包括所述线程创建节点所创建的线程的开始节点之后的节点中,能够与所述线程创建节点的直接后继节点并发的节点;
则,所述遍历单元640可以用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,计算遍历到的每个节点的并发节点集合,其中:如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述初始计算单元计算得到的该当前节点的初始并发节点集合与该当前节点的所有直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
在该实现方式中,由于初始计算单元620仅计算了线程的开始节点的初始并发节点集合、线程创建节点的直接后继节点的初始并发节点集合中至少应包括的部分,后续在遍历的过程中通过继承其直接前驱节点的并发节点集合进行补充,计算量小,效率较高。
另一种是,如果当前节点是线程创建节点的直接后继节点或者开始节点,且当前节点的初始并发节点集合已经包括该当前节点在程序控制流图内的所有并发节点;
则,所述遍历单元640用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,计算遍历到的每个节点的并发节点集合,其中:如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述初始计算单元计算得到的该当前节点的初始并发节点集合;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
需要说明的是,在本发明实施例中,所述线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程中的至少一个节点,因此,所述线程终止节点的直接后继节点的初始无法并发节点集合可以包括整个程序控制流图范围内所有与该线程终止节点的直接后继节点无法并发的节点集合,也可以仅包括所述线程终止节点所终止的线程的全部节点,或者其他实施方式,在本发明中并不进行限制。下面,对所述线程终止节点的直接后继节点的初始无法并发节点集合仅包括所述线程终止节点所终止的线程的全部节点的实施方式进行详细介绍:
在所述线程终止节点的直接后继节点的初始无法并发节点集合仅包括所述线程终止节点所终止的线程的全部节点的实施方式中,一种可选的方式是在遍历的过程中通过继承其直接前驱节点的无法并发节点集合进行补充。具体地,例如,其中:
所述初始计算单元620,可以用于计算出线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述计算出的线程终止节点的直接后继节点的初始无法并发节点集合中,仅包括所述线程终止节点所终止的线程的全部节点;
另外,所述初始计算单元620,还可以用于根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合;
所述初始化单元630,还可以用于初始化所述程序控制流图的首节点的无法并发节点集合;
所述遍历单元640,还可以用于计算遍历到的每个节点的无法并发节点集合,其中:如果遍历到的当前节点是线程的开始节点,或者是线程终止节点的直接后继节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合与所述初始计算单元计算得到的该当前节点的初始无法并发节点集合的并集,当所述当前节点的直接前驱节点为多个时,所述当前节点的无法并发节点集合等于该当前节点所有直接前驱节点的无法并发节点集合的交集、与所述初始计算单元计算得到的该当前节点的初始无法并发节点集合的并集;如果遍历到的当前节点是除线程的开始节点以及线程终止节点的直接后继节点以外的节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合,当所述当前节点的直接前驱节点仅为多个时,该当前节点的无法并发节点集合等于该当前节点的所有直接前驱节点的无法并发节点集合的交集。
需要说明的是,如果当前节点是线程终止节点的直接后继节点,则计算当前节点的无法并发节点集合的步骤一定要在计算并发节点集合之前,以使当前节点所计算出的并发节点集合中一定排除了由于线程终止产生的无法并发节点。对于除了线程终止节点的直接后继节点以外的节点,计算无法并发节点集合与计算并发节点集合的顺序可以互换,不影响计算并发节点集合的结果。另外,计算初始并发节点集合、初始无法并发节点集合或者初始化首节点的并发节点集合以及无法并发节点集合的各个步骤之间也没有必须遵循的顺序,可以进行任意互换。而且,本发明实施例的所述遍历,应该是从上到下的遍历,从而使一个节点的并发节点集合或者无法并发节点集合得以在其直接前驱节点的并发节点集合已经计算得到的情况下进行计算。
可见,应用图7所示本发明实施例,对于线程终止节点的直接后继节点来说,所述线程终止节点的直接后继节点的初始无法并发节点集合中,可以仅包括所述线程终止节点所终止的线程的全部节点,对于线程的开始节点来说,可以根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合,进而在遍历的过程中,再对其无法并发节点进行补充,与计算出整个程序控制流图范围内所有的无法并发节点相比较,一定程度上减少了计算量,提高了效率。而且,在遍历过程中计算每个节点的无法并发节点集合时,还考虑到如果当前节点的直接前驱节点有多个时,由于程序实际一次执行一般只执行其中一个可能的分支,并不会执行全部,取当前节点的直接前驱节点的无法并发节点集合的交集补充到当前节点的无法并发节点集合中,能够保证所获得的当前其无法并发节点集合达到最小集,所有可能并发的节点一定都将保留在其并发节点集合中,有利于以后对可能并发的节点的相关处理,不会遗漏并发节点。
另外,考虑到程序控制流图中,一个线程创建节点的直接后继节点可能为多个、一个线程终止节点的直接后继节点也可能为多个,为了减少计算量,提高效率,本发明实施例一种可能的实现方式中,在一个线程创建节点与其直接后继节点之间插入一个辅助创建节点、在一个线程终止节点与其直接后继节点之间插入一个辅助终止节点,以减少针对线程创建节点的直接后继节点、以及针对线程终止节点的直接后继节点的计算量。具体地,例如,基于上述图6所示实施例,如图7所示的本发明实施例提供的一种并发分析装置的结构示意图之三:所述获取流图单元610可以包括获取流图子单元710a,辅助创建节点增加子单元710b,辅助终止节点增加子单元710c;
其中,所述获取流图子单元710a,可以用于获取各个线程的控制流图;
所述辅助创建节点增加子单元710b,可以用于为所述各个线程的控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
所述辅助终止节点增加子单元710c,可以用于为所述各个线程的控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点。
相应地,所述初始计算单元620,可以用于计算程序控制流图中每个线程的开始节点的初始并发节点集合、计算程序控制流图中每个辅助创建节点的初始并发节点集合、计算程序控制流图中每个辅助终止节点的初始无法并发节点集合;所述遍历单元640,可以用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,计算遍历到的每个节点的并发节点集合,其中:如果遍历到的当前节点不是辅助终止节点,则,所述当前节点的并发节点集合至少包括该当前节点的所有直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是辅助创建节点或者线程的开始节点,则,所述当前节点的并发节点集合至少包括所述初始计算单元计算得到的该当前节点的初始并发节点集合;如果遍历到的当前节点是辅助终止节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
可见,应用图7所示本发明实施例提供的方法,由于增加辅助创建节点以及辅助终止节点,对于一个线程创建节点来说,可以将原本可能针对该线程创建节点的多个直接后继节点的计算化为针对一个辅助创建节点的计算,对于一个线程终止节点来说,可以将原本可能针对线程终止节点的多个直接后继节点的计算化为针对一个辅助终止节点的计算,从而可以减少计算量,提高效率。
需要说明的是,在如图7所示的本发明实施例中,计算开始节点的初始并发节点集合的具体实现方式不限。下面给出一种可能的实现方式,例如,如图8所示,所述初始计算单元620可以包括第一局部计算子单元820a,第一并发计算子单元820b;
其中,第一局部计算子单元820a,可以用于为每个线程的开始节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的开始节点、以及在整个程序控制流图范围内,所有被对应的开始节点控制的第一节点,其中,所述被对应的开始节点控制的第一节点是指从程序控制流图首节点开始到第一节点自身的路径中必须经过所述对应的开始节点的节点;
所述第一并发计算子单元820b,可以用于针对每个线程的开始节点,分别执行以下第一并发节点计算步骤以计算出每个线程的开始节点的初始并发节点集合,其中,所述第一并发节点计算步骤包括:计算在对应的辅助创建节点之后、与所述对应的辅助创建节点有可达路径的第三节点集合,其中,所述对应的辅助创建节点为所针对的线程的开始节点的直接前驱节点的直接后继节点中的辅助创建节点,根据所针对的线程的开始节点的初始并发节点集合等于所述第三节点集合减去所述第一局部计算子单元生成的该开始节点对应的局部控制集合,计算出所针对的线程的开始节点的初始并发节点集合。
需要说明的是,其中,所述开始节点对应的局部控制集合的具体生成方式不限,在本发明实施例一种可能的实现方式中,可以预先计算出每个开始节点在其所在线程内被其控制的节点的集合,即每个开始节点分别在其所在线程内对应的终止控制集合,再根据线程与线程之间由于终止关系形成的辅助终止节点的终止控制集合被开始节点控制的控制关系,将辅助终止节点的终止控制集合传递到开始节点的终止控制集合中,进而最终可以得到每个开始节点对应的完整的局部控制集合,由于在该实现方式中,针对开始节点以及辅助终止节点在单个线程内的终止控制集合的计算,因此,可以分别进行串行或者并行的计算,再传递到开始节点的局部控制集合中,能够达到提高效率的目的,具体地,例如,所述第一局部计算子单元820a可以包括第一初始终止子单元820a.1、第一追加子单元820a.2、第一初始局部子单元820a.3,第二追加子单元820a.4;
其中,所述第一初始终止子单元820a.1,可以用于为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
所述第一追加子单元820a.2,可以用于针对从所述第一初始终止子单元得到的每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,并判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
所述第一初始局部子单元820a.3,可以用于为每个线程的开始节点各初始化一个对应的局部控制集合,将每个线程的开始节点,以及在该开始节点所在线程内所有被该开始节点控制的节点加入到对应的局部控制集合中;
所述第二追加子单元820a.4,可以用于针对从所述第一初始局部子单元得到的每个线程的开始节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断所述第一追加子单元计算得到的该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
需要说明的是,在本发明实施例中,计算程序控制流图中每个辅助创建节点的初始并发节点集合的具体实现方式不限。下面给出一种可能的实现方式:与上述为线程的开始节点计算初始并发节点集合的原理类似地,所述初始计算单元620可以包括第二局部计算子单元820c,第二并发计算子单元820d;
其中,所述第二局部计算子单元820c,可以用于为每个辅助创建节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的辅助创建节点、以及在整个程序控制流图范围内,所有被对应的辅助创建节点控制的第二节点,其中,所述被对应的辅助创建节点控制的第二节点是指从程序控制流图首节点开始到第二节点自身的路径中必须经过所述对应的辅助创建节点的节点;
所述第二并发计算子单元820d,可以用于针对每个辅助创建节点,分别执行以下第二并发节点计算步骤以计算出每个辅助创建节点的初始并发节点集合,其中,所述第二并发节点计算步骤包括:计算在对应的开始节点之后、与所述对应的开始节点有可达路径的第四节点集合,其中,所述对应的开始节点为所针对的辅助创建节点的直接前驱节点的直接后继节点中的开始节点,根据所针对的辅助创建节点的初始并发节点集合等于所述第四节点集合减去所述第二局部计算子单元生成的该辅助创建节点对应的局部控制集合,计算出所针对的辅助创建节点的初始并发节点集合。
其中,所述辅助创建节点对应的局部控制集合的具体生成方式不限,在本发明实施例一种可能的实现方式中,基于与上述开始节点的局部控制集合计算相同的原理,具体地,例如:所述第二局部计算子单元820c可以包括第二初始终止子单元820c.1、第三追加子单元820c.2、第二初始局部子单元820c.3,第四追加子单元820c.4;
其中,所述第二初始终止子单元820c.1,可以用于为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
所述第三追加子单元820c.2,可以用于针对从所述第二初始终止子单元得到的每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,并判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
所述第二初始局部子单元820c.3,可以用于为每个辅助创建节点各初始化一个对应的局部控制集合,将每个辅助创建节点,以及在该辅助创建节点所在线程内所有被该辅助创建节点控制的节点加入到对应的局部控制集合中;
所述第四追加子单元820c.4,可以用于针对从所述第二初始局部子单元得到的每个辅助创建节点对应的局部控制集合,分别进入所述第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断所述第三追加子单元计算得到的该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
在本发明实施例又一种可能的实现方式中,结合上述本发明实施例增加辅助创建节点、辅助终止节点的实现方式,提出了如下的从上到下遍历的具体实现方式。例如,基于上述图7所示实施例,参见图9,示出了本发明实施例提供的一种并发分析装置的结构示意图之四。如图所示,该实施例中,获取流图单元610可以包括获取流图子单元710a,辅助创建节点增加子单元710b,辅助终止节点增加子单元710c;详细可参见上述图7所示实施例的介绍,在此不再赘述。
所述初始计算单元620,还可以用于在所述遍历开始之前,将除了线程的开始节点以及线程创建节点的直接后继节点之外的节点的初始并发节点集合初始化为空集;
所述遍历单元640可以包括首节点设置子单元940a、第一判断子单元940b、第一返回子单元940c、结束子单元940d、访问子单元940e、节点更新子单元940f、第二判断子单元940g、第二返回子单元940h、第三判断子单元940i、第一遍历计算子单元940j,第二遍历计算子单元940k;
其中,所述首节点设置子单元940a,可以用于将程序控制流图的首节点作为当前节点;
所述第一判断子单元940b,可以用于判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点;
所述第一返回子单元940c,可以用于所述第一判断子单元判断为否且所述当前节点不是程序控制流图的首节点时,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并重新触发所述第一判断子单元940b;
所述结束子单元940d,可以用于所述第一判断子单元判断为否且所述当前节点是程序控制流图的首节点时,结束流程;
所述访问子单元940e,可以用于所述第一判断子单元判断为是时,访问当前节点的直接后继节点中还未被计算出并发节点集合的直接后继节点;
所述节点更新子单元940f,可以用于在所述访问单元访问当前节点的直接后继节点中还未被计算出并发节点集合的直接后继节点时,将当前节点更新为正在被访问的节点;
所述第二判断子单元940g,可以用于在所述节点更新子单元更新后,判断当前节点的直接前驱节点中是否有一个节点未被计算出并发节点集合、且该没有被计算出并发节点集合的节点与当前节点之间的有向边不是循环的回边;
所述第二返回子单元940h,可以用于所述第二判断子单元判断为是时,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并重新触发所述第一判断子单元940b;
所述第三判断子单元940i,可以用于所述第二判断子单元判断为否时,判断当前节点是否为辅助终止节点;
所述第一遍历计算子单元940j,可以用于所述第三判断子单元判断为是时,则,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并重新触发所述第一判断子单元940b;
所述第二遍历计算子单元940k,可以用于所述第三判断子单元判断为否时,则,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的初始并发节点集合与该当前节点的直接前驱节点的并发节点集合的并集,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并重新触发所述第一判断子单元940b。
应用图9所示本发明实施例,由于其遍历过程中在对当前节点的并发节点集合进行计算之前,判断了当前节点的直接前驱节点是否未被计算并发节点集合,因此,可以保证是从上到下的遍历,保证一个节点的无法节点集合在计算之前,能够得到其所有直接前驱节点的已经计算出的并发节点集合,不会遗漏并发节点。
进一步地,本发明实施例还提供一种终端的硬件构成。
至少一个网络接口或者其他通信接口,存储器,和至少一个通信总线,用于实现这些装置之间的连接通信。处理器用于执行存储器中存储的可执行模块,例如计算机程序。存储器可能包含高速随机存取存储器(RAM:Random Access Memory),也可能还包括非不稳定的存储器(non-volatile memory),例如至少一个磁盘存储器。
在一些实施方式中,存储器中存储了程序指令,程序指令可以被处理器执行,其中,程序指令用于执行本发明实施例所述的方法,例如:可以包括:
获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为该线程创建节点所创建的线程的开始节点的直接前驱节点;
计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点,其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点,其中,线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程中的至少一个节点;
初始化所述程序控制流图的首节点的并发节点集合,从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合:
其中,所述继承原则包括:如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去该当前节点的初始无法并发节点集合
可以理解的是,所述程序指令执行的本发明实施例的方法可以包括本文所述各实施例所述的方法及基于本发明实施例的方法的其他实现方式,这里不再赘述。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到上述实施例方法中的全部或部分步骤可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者诸如媒体网关等网络通信设备,等等)执行本发明各个实施例或者实施例的某些部分所述的方法。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
而且,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上所述仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。凡在本发明的精神和原则之内所作的任何修改、等同替换、改进等,均包含在本发明的保护范围内。
Claims (20)
1.一种并发分析方法,其特征在于,包括:
获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为所述线程创建节点所创建的线程的开始节点的直接前驱节点;
计算所述程序控制流图中每个线程的开始节点的初始并发节点集合、每个所述线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合;其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点;其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点;其中,所述线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
初始化所述程序控制流图的首节点的并发节点集合,从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合:
其中,所述继承规则包括:
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去该当前节点的初始无法并发节点集合。
2.根据权利要求1所述的方法,其特征在于,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;
所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
3.根据权利要求2所述的方法,其特征在于,所述每个线程的开始节点的初始并发节点集合中仅包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;
所述每个线程创建节点的直接后继节点的初始并发节点集合中仅包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述当前节点的初始并发节点集合与该当前节点的所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合。
4.根据权利要求2所述的方法,其特征在于,所述线程终止节点的直接后继节点的初始无法并发节点集合中,仅包括所述线程终止节点所终止的线程的全部节点;
在所述遍历开始之前,还包括:
根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合;
初始化所述程序控制流图的首节点的无法并发节点集合;
在所述遍历过程中,还包括:计算遍历到的每个节点的无法并发节点集合,其中:
如果遍历到的当前节点是线程的开始节点,或者是线程终止节点的直接后继节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合与该当前节点的初始无法并发节点集合的并集,当所述当前节点的直接前驱节点为多个时,所述当前节点的无法并发节点集合等于该当前节点所有直接前驱节点的无法并发节点集合的交集、与所述当前节点的初始无法并发节点集合的并集;
如果遍历到的当前节点是除线程的开始节点以及线程终止节点的直接后继节点以外的节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合,当所述当前节点的直接前驱节点仅为多个时,该当前节点的无法并发节点集合等于该当前节点的所有直接前驱节点的无法并发节点集合的交集。
5.根据权利要求2所述的方法,其特征在于,所述获取程序控制流图之后,还包括:
获取程序控制流图;
为所述程序控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
为所述程序控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点;
所述计算程序控制流图中每个线程创建节点的直接后继节点的初始并发节点集合具体为计算程序控制流图中每个辅助创建节点的初始并发节点集合;
所述计算程序控制流图中每个线程终止节点的直接后继节点的初始无法并发节点集合具体为计算程序控制流图中每个辅助终止节点的初始无法并发节点集合。
6.根据权利要求5所述的方法,其特征在于,所述计算出程序控制流图中每个线程的开始节点的初始并发节点集合包括:
为每个线程的开始节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的开始节点、以及在整个程序控制流图范围内,所有被对应的开始节点控制的第一节点,其中,所述被对应的开始节点控制的第一节点是指从程序控制流图首节点开始到第一节点自身的路径中必须经过所述对应的开始节点的节点;
针对每个线程的开始节点,分别执行以下第一并发节点计算步骤以计算出每个线程的开始节点的初始并发节点集合,其中,所述第一并发节点计算步骤包括:计算在对应的辅助创建节点之后、与所述对应的辅助创建节点有可达路径的第三节点集合,其中,所述对应的辅助创建节点为所针对的线程的开始节点的直接前驱节点的直接后继节点中的辅助创建节点,根据所针对的线程的开始节点的初始并发节点集合等于所述第三节点集合减去该开始节点对应的局部控制集合,计算出所针对的线程的开始节点的初始并发节点集合。
7.根据权利要求6所述的方法,其特征在于,所述为每个线程的开始节点各生成一个局部控制集合包括:
为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
针对每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
为每个线程的开始节点各初始化一个对应的局部控制集合,将每个线程的开始节点,以及在该开始节点所在线程内所有被该开始节点控制的节点加入到对应的局部控制集合中;
针对每个线程的开始节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
8.根据权利要求5所述的方法,其特征在于,所述计算出程序控制流图中每个线程创建节点的直接后继节点的初始并发节点集合包括:
为每个辅助创建节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的辅助创建节点、以及在整个程序控制流图范围内,所有被对应的辅助创建节点控制的第二节点,其中,所述被对应的辅助创建节点控制的第二节点是指从程序控制流图首节点开始到第二节点自身的路径中必须经过所述对应的辅助创建节点的节点;
针对每个辅助创建节点,分别执行以下第二并发节点计算步骤以计算出每个辅助创建节点的初始并发节点集合,其中,所述第二并发节点计算步骤包括:计算在对应的开始节点之后、与所述对应的开始节点有可达路径的第四节点集合,其中,所述对应的开始节点为所针对的辅助创建节点的直接前驱节点的直接后继节点中的开始节点,根据所针对的辅助创建节点的初始并发节点集合等于所述第四节点集合减去该辅助创建节点对应的局部控制集合,计算出所针对的辅助创建节点的初始并发节点集合。
9.根据权利要求8所述的方法,其特征在于,所述为每个辅助创建节点各生成一个对应的局部控制集合包括:
为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
针对每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
为每个辅助创建节点各初始化一个对应的局部控制集合,将每个辅助创建节点,以及在该辅助创建节点所在线程内所有被该辅助创建节点控制的节点加入到对应的局部控制集合中;
针对每个辅助创建节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的结束节点,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
10.根据权利要求5所述的方法,其特征在于,在所述遍历开始之前,还将除了线程的开始节点以及线程创建节点的直接后继节点之外的节点的初始并发节点集合初始化为空集;
所述从程序控制流图的首节点开始向下遍历包括:
将程序控制流图的首节点作为当前节点;
判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点;
如果否且所述当前节点不是程序控制流图的首节点,则将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤,如果否且所述当前节点是程序控制流图的首节点,结束流程;
如果是,访问当前节点的直接后继节点中还未被计算出并发节点集合的直接后继节点;
将当前节点更新为正在被访问的节点;
判断当前节点的直接前驱节点中是否有一个节点未被计算出并发节点集合、且未被计算出并发节点集合的节点与当前节点之间的有向边不是循环的回边;
如果是,则将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤;
否则,判断当前节点是否为辅助终止节点;
如果当前节点是辅助终止节点,则,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤;
如果当前节点不是辅助终止节点,则,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的初始并发节点集合与该当前节点的直接前驱节点的并发节点集合的并集,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并返回到所述判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点的步骤。
11.一种并发分析装置,其特征在于,包括:
获取流图单元,用于获取程序控制流图,其中,在所述程序控制流图中,线程创建节点为所述线程创建节点所创建的线程的开始节点的直接前驱节点;
初始计算单元,用于计算所述获取流图单元获取的程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合;其中,所述每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,至少一个能够与所述开始节点并发的节点;其中,所述线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,至少一个能够与所述线程创建节点的直接后继节点并发的节点;其中,所述线程终止节点的直接后继节点的初始无法并发节点集合至少包括所述线程终止节点所终止的线程的全部节点;
初始化单元,用于初始化所述程序控制流图的首节点的并发节点集合;
遍历单元,用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合;其中,所述继承原则包括:如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的至少一个直接前驱节点的并发节点集合;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述初始计算单元计算得到的该当前节点的初始并发节点集合与至少一个直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的至少一个直接前驱节点的并发节点集合减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
12.根据权利要求11所述的装置,其特征在于,所述初始计算单元,用于计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中:所计算出的每个线程的开始节点的初始并发节点集合包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;所计算出的每个线程的线程创建节点的直接后继节点的初始并发节点集合包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;所计算出的线程终止节点的直接后继节点的初始无法并发节点集合包括所述线程终止节点所终止的线程中的全部节点;
所述遍历单元,用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,根据以下继承规则,计算出遍历到的每个节点的并发节点集合:其中,所述继承原则包括:
如果遍历到的当前节点不是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集;
如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合包括所述当前节点的初始并发节点集合与所有直接前驱节点的并发节点集合的并集;
如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合包括该当前节点的所有直接前驱节点的并发节点集合的并集减去该当前节点的初始无法并发节点集合。
13.根据权利要求12所述的装置,其特征在于,所述初始计算单元,用于计算程序控制流图中每个线程的开始节点的初始并发节点集合、每个线程创建节点的直接后继节点的初始并发节点集合、以及每个线程终止节点的直接后继节点的初始无法并发节点集合,其中,所计算出的每个线程的开始节点的初始并发节点集合中仅包括用于创建所述开始节点所在线程的线程创建节点之后的节点中,所有能够与所述开始节点并发的节点;所计算出的每个线程创建节点的直接后继节点的初始并发节点集合中仅包括所述线程创建节点所创建的线程的开始节点之后的节点中,所有能够与所述线程创建节点的直接后继节点并发的节点;
所述遍历单元,用于从所述程序控制流图的首节点开始向下遍历,在所述遍历过程中,计算遍历到的每个节点的并发节点集合,其中:如果遍历到的当前节点不是线程终止节点的直接后继节点、线程创建节点的直接后继节点、以及线程的开始节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集;如果当前节点是线程创建节点的直接后继节点或者线程的开始节点,则,所述当前节点的并发节点集合等于所述初始计算单元计算得到的当前节点的初始并发节点集合与该当前节点的所有直接前驱节点的并发节点集合的并集;如果遍历到的当前节点是线程终止节点的直接后继节点,则,所述当前节点的并发节点集合等于该当前节点的所有直接前驱节点的并发节点集合的并集至少减去所述初始计算单元计算得到的该当前节点的初始无法并发节点集合。
14.根据权利要求12所述的装置,其特征在于,所述初始计算单元,用于计算出线程终止节点的直接后继节点的初始无法并发节点集合,其中,所述计算出的线程终止节点的直接后继节点的初始无法并发节点集合中,仅包括所述线程终止节点所终止的线程的全部节点;
所述初始计算单元,还用于根据线程的开始节点的初始无法并发节点集合等于创建该线程的线程创建节点所在线程的开始节点到该线程创建节点的可达路径上的节点集合,计算出每个线程的开始节点的初始无法并发节点集合;
所述初始化单元,还用于初始化所述程序控制流图的首节点的无法并发节点集合;
所述遍历单元,还用于计算遍历到的每个节点的无法并发节点集合,其中:如果遍历到的当前节点是线程的开始节点,或者是线程终止节点的直接后继节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合与所述初始计算单元计算得到的该当前节点的初始无法并发节点集合的并集,当所述当前节点的直接前驱节点为多个时,所述当前节点的无法并发节点集合等于该当前节点所有直接前驱节点的无法并发节点集合的交集、与所述初始计算单元计算得到的当前节点的初始无法并发节点集合的并集;如果遍历到的当前节点是除线程的开始节点以及线程终止节点的直接后继节点以外的节点,则,当所述当前节点的直接前驱节点仅为一个时,所述当前节点的无法并发节点集合等于该当前节点的直接前驱节点的无法并发节点集合,当所述当前节点的直接前驱节点为多个时,该当前节点的无法并发节点集合等于该当前节点的所有直接前驱节点的无法并发节点集合的交集。
15.根据权利要求12任一项所述的装置,其特征在于,所述获取流图单元包括获取流图子单元,辅助创建节点增加子单元,辅助终止节点增加子单元;
其中,所述获取流图子单元,用于获取各个线程的控制流图;
所述辅助创建节点增加子单元,用于为所述各个线程的控制流图中的每个线程创建节点各新增一个直接后继节点,该直接后继节点为辅助创建节点,将所述线程创建节点原有的直接后继节点改为该线程创建节点的直接后继节点中新增的所述辅助创建节点的直接后继节点,将所述线程创建节点记为该线程创建节点所创建的线程的开始节点的直接前驱节点;
所述辅助终止节点增加子单元,用于为所述各个线程的控制流图中的每个用于结束另一线程的线程终止节点各新增一个直接后继节点,该直接后继节点为辅助终止节点,将所述线程终止节点原有的直接后继节点改为该线程终止节点的直接后继节点中新增的所述辅助终止节点的直接后继节点,将所述线程终止节点所终止的线程的结束节点改为该线程终止节点的新增的直接后继节点的直接前驱节点。
16.根据权利要求15所述的装置,其特征在于,所述初始计算单元包括第一局部计算子单元,第一并发计算子单元;
其中,第一局部计算子单元,用于为每个线程的开始节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的开始节点、以及在整个程序控制流图范围内,所有被对应的开始节点控制的第一节点,其中,所述被对应的开始节点控制的第一节点是指从程序控制流图首节点开始到第一节点自身的路径中必须经过所述对应的开始节点的节点;
所述第一并发计算子单元,用于针对每个线程的开始节点,分别执行以下第一并发节点计算步骤以计算出每个线程的开始节点的初始并发节点集合,其中,所述第一并发节点计算步骤包括:计算在对应的辅助创建节点之后、与所述对应的辅助创建节点有可达路径的第三节点集合,其中,所述对应的辅助创建节点为所针对的线程的开始节点的直接前驱节点的直接后继节点中的辅助创建节点,根据所针对的线程的开始节点的初始并发节点集合等于所述第三节点集合减去所述第一局部计算子单元生成的该开始节点对应的局部控制集合,计算出所针对的线程的开始节点的初始并发节点集合。
17.根据权利要求16所述的装置,其特征在于,所述第一局部计算子单元包括第一初始终止子单元、第一追加子单元、第一初始局部子单元,第二追加子单元;
其中,所述第一初始终止子单元,用于为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
所述第一追加子单元,用于针对从所述第一初始终止子单元得到的每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
所述第一初始局部子单元,用于为每个线程的开始节点各初始化一个对应的局部控制集合,将每个线程的开始节点,以及在该开始节点所在线程内所有被该开始节点控制的节点加入到对应的局部控制集合中;
所述第二追加子单元;用于针对从所述第一初始局部子单元得到的每个线程的开始节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断所述第一追加子单元计算得到的该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
18.根据权利要求15所述的装置,其特征在于,所述初始计算单元包括第二局部计算子单元,第二并发计算子单元;
其中,所述第二局部计算子单元,用于为每个辅助创建节点各生成一个对应的局部控制集合,其中,所述局部控制集合中包括与该局部控制集合对应的辅助创建节点、以及在整个程序控制流图范围内,所有被对应的辅助创建节点控制的第二节点,其中,所述被对应的辅助创建节点控制的第二节点是指从程序控制流图首节点开始到第二节点自身的路径中必须经过所述对应的辅助创建节点的节点;
所述第二并发计算子单元,用于针对每个辅助创建节点,分别执行以下第二并发节点计算步骤以计算出每个辅助创建节点的初始并发节点集合,其中,所述第二并发节点计算步骤包括:计算在对应的开始节点之后、与所述对应的开始节点有可达路径的第四节点集合,其中,所述对应的开始节点为所针对的辅助创建节点的直接前驱节点的直接后继节点中的开始节点,根据所针对的辅助创建节点的初始并发节点集合等于所述第四节点集合减去所述第二局部计算子单元生成的该辅助创建节点对应的局部控制集合,计算出所针对的辅助创建节点的初始并发节点集合。
19.根据权利要求18所述的装置,其特征在于,所述第二局部计算子单元包括第二初始终止子单元、第三追加子单元、第二初始局部子单元,第四追加子单元;
其中,所述第二初始终止子单元,用于为每个辅助终止节点各初始化一个对应的终止控制集合,其中,将辅助终止节点、以及在辅助终止节点所在线程内、被辅助终止节点控制的节点加入该辅助终止节点的终止控制集合;
所述第三追加子单元,用于针对从所述第二初始终止子单元得到的每个辅助终止节点对应的终止控制集合,分别进入第一追加步骤,所述第一追加步骤包括:判断所针对的终止控制集合中是否包括线程的结束节点,如果是,则判断该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的辅助终止节点的终止控制集合加入所针对的终止控制集合,其中,所述结束节点对应的辅助终止节点为用于终止该结束节点所在线程的线程终止节点的直接后继节点中的辅助终止节点,判断所针对的终止控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第一追加步骤;
所述第二初始局部子单元,用于为每个辅助创建节点各初始化一个对应的局部控制集合,将每个辅助创建节点,以及在该辅助创建节点所在线程内所有被该辅助创建节点控制的节点加入到对应的局部控制集合中;
所述第四追加子单元,用于针对从所述第二初始局部子单元得到的每个辅助创建节点对应的局部控制集合,分别进入第二追加步骤,所述第二追加步骤包括:判断所针对的局部控制集合中是否包括线程的结束节点,如果是,则判断所述第三追加子单元计算得到的该结束节点对应的辅助终止节点的终止控制集合是否非空,如果非空,将该结束节点对应的终止控制集合加入所述所针对的局部控制集合,并判断所针对的局部控制集合是否有新加入的结束节点,如果有新加入的,将所述新加入的结束节点作为判断对象,返回到所述判断该结束节点对应的辅助终止节点的终止控制集合是否非空的步骤,如果无新加入的,结束所述第二追加步骤。
20.根据权利要求15所述的装置,其特征在于,所述初始化单元,还用于在所述遍历开始之前,将除了线程的开始节点以及线程创建节点的直接后继节点之外的节点的初始并发节点集合初始化为空集;
所述遍历单元包括首节点设置子单元、第一判断子单元、第一返回子单元、结束子单元、访问子单元、节点更新子单元、第二判断子单元、第二返回子单元、第三判断子单元、第一遍历计算子单元,第二遍历计算子单元;
其中,所述首节点设置子单元,用于将程序控制流图的首节点作为当前节点;
所述第一判断子单元,用于判断当前节点的直接后继节点中是否存在还未被计算出并发节点集合的直接后继节点;
所述第一返回子单元,用于所述第一判断子单元判断为否且所述当前节点不是程序控制流图的首节点时,将所述当前节点的直接前驱节点作为当前节点,重新触发所述第一判断子单元;
所述结束子单元,用于所述第一判断子单元判断为否且所述当前节点是程序控制流图的首节点时,结束流程;
所述访问子单元,用于所述第一判断子单元判断为是时,访问当前节点的直接后继节点中还未被计算出并发节点集合的直接后继节点;
所述节点更新子单元,用于在所述访问单元访问节点时,将当前节点更新为正在被访问的节点;
所述第二判断子单元,用于在所述节点更新子单元更新后,判断当前节点的直接前驱节点中是否有一个节点未被计算出并发节点集合、且未被计算出并发节点集合的节点与当前节点之间的有向边不是循环的回边;
所述第二返回子单元,用于所述第二判断子单元判断为是时,将当前节点更新为所述当前节点的直接前驱节点中、刚刚被访问的直接前驱节点,并重新触发所述第一判断子单元;
所述第三判断子单元,用于所述第二判断子单元判断为否时,判断当前节点是否为辅助终止节点;
所述第一遍历计算子单元,用于所述第三判断子单元判断为是时,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的直接前驱节点的并发节点集合的并集至少减去该当前节点的初始无法并发节点集合;
所述第二遍历计算子单元,用于所述第三判断子单元判断为否时,计算所述当前节点的并发节点集合,其中,所述当前节点的并发节点集合等于该当前节点的初始并发节点集合与该当前节点的直接前驱节点的并发节点集合的并集。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310617816.4A CN104679484B (zh) | 2013-11-27 | 2013-11-27 | 一种并发分析方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201310617816.4A CN104679484B (zh) | 2013-11-27 | 2013-11-27 | 一种并发分析方法及装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104679484A CN104679484A (zh) | 2015-06-03 |
CN104679484B true CN104679484B (zh) | 2018-02-06 |
Family
ID=53314606
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201310617816.4A Expired - Fee Related CN104679484B (zh) | 2013-11-27 | 2013-11-27 | 一种并发分析方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104679484B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105930105B (zh) * | 2016-05-20 | 2018-11-20 | 中国农业银行股份有限公司 | 一种并行网关的节点检测方法及装置 |
CN108513658B (zh) | 2016-12-30 | 2022-02-25 | 华为技术有限公司 | 一种事务处理方法及装置 |
CN106919368B (zh) * | 2017-01-12 | 2019-01-29 | 北京中科睿芯科技有限公司 | 一种流式数据流图关键路径的加速方法、加速系统、装置及芯片 |
Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101937396A (zh) * | 2010-09-30 | 2011-01-05 | 中国科学院软件研究所 | 软件程序中变量的不安全使用的检测方法 |
CN102073589A (zh) * | 2010-12-29 | 2011-05-25 | 北京邮电大学 | 一种基于代码静态分析的数据竞争检测方法及系统 |
Family Cites Families (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20120290883A1 (en) * | 2010-11-11 | 2012-11-15 | Nec Laboratories America, Inc. | Computer Implemented Method for Precise May-Happen-in-Parallel Analysis with Applications to Dataflow Analysis of Concurrent Programs |
US9141359B2 (en) * | 2010-12-13 | 2015-09-22 | Hewlett-Packard Development Company, L.P. | Procedural concurrency graph generator |
-
2013
- 2013-11-27 CN CN201310617816.4A patent/CN104679484B/zh not_active Expired - Fee Related
Patent Citations (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101937396A (zh) * | 2010-09-30 | 2011-01-05 | 中国科学院软件研究所 | 软件程序中变量的不安全使用的检测方法 |
CN102073589A (zh) * | 2010-12-29 | 2011-05-25 | 北京邮电大学 | 一种基于代码静态分析的数据竞争检测方法及系统 |
Non-Patent Citations (3)
Title |
---|
An efficient algorithm for computing MHP information for concurrent Java programs;Gleb Naumovich et al.;《Proceeding ESEC/FSE7 Proceedings of the 7th European software》;19990910;第338-354页 * |
Can We Make It Faster? Efficient May-Happen-in-Parallel Analysis Revisited;Congming Chen et al.;《2012 13th International Conference on Parallel and Distributed Computing, Applications and Technologies》;20121216;第59-64页 * |
Making it practical and effective: fast and precise mayhappeninparallel;Congming Chen et al.;《Proceeding PACT "12 Proceedings of the 21st international conference on Parallel architectures and compilation techniques》;20120923;第469-470页 * |
Also Published As
Publication number | Publication date |
---|---|
CN104679484A (zh) | 2015-06-03 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104679484B (zh) | 一种并发分析方法及装置 | |
Dietterich | An overview of MAXQ hierarchical reinforcement learning | |
US20170346732A1 (en) | Using headerspace analysis to identify flow entry reachability | |
Jong et al. | The utility of temporal abstraction in reinforcement learning. | |
Hauschildt et al. | Petri net algorithms in the theory of matrix grammars | |
US5999178A (en) | Selection, type matching and manipulation of resource objects by a computer program | |
CN109598184B (zh) | 一种多分割任务的处理方法和装置 | |
Mankowitz et al. | Time regularized interrupting options | |
Braverman et al. | Stabilisation of difference equations with noisy prediction-based control | |
Popp et al. | Automatic generation of the behavior of a user interface from a high-level discourse model | |
Aamodt | A Case-Based Answer to Some Problems of Knowledge-Based Systems. | |
Barreto et al. | Modeling and analysis of video games based on workflow nets and state graphs | |
Camilli et al. | Approximation of optimal control problems with state constraints: estimates and applications | |
Boddy | Imperfect match: PDDL 2.1 and real applications | |
Beneš et al. | Dual-priced modal transition systems with time durations | |
De Peuter et al. | Zero-shot assistance in sequential decision problems | |
Reis et al. | Simulation of McKean Vlasov SDEs with super linear growth | |
Shi et al. | Iconic animation of construction simulation | |
Ororbia et al. | Structural design synthesis through a sequential decision process | |
CN112297012B (zh) | 一种基于自适应模型的机器人强化学习方法 | |
CN107180133A (zh) | 一种cps建模的方法及装置 | |
CN104866299B (zh) | 用于软件应用程序中的焦点管理的方法和系统 | |
Bacon et al. | Constructing temporal abstractions autonomously in reinforcement learning | |
Adamski et al. | Hierarchical Petri nets for digital controller design | |
CN113393667A (zh) | 一种基于Categorical-DQN乐观探索的交通控制方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20180206 Termination date: 20201127 |