陳麗特
(安徽理工大學 計算機科學與工程學院,安徽 淮南 232001)
引言。在單個程序里面同時運行多個線程來完成不同任務,稱為多線程。多線程主要目的是為了節(jié)約CPU時間,提高CUP的利用率。但多線程會給程序帶來更多難以發(fā)現(xiàn)的bug。Petri是一種功能強大的分布式系統(tǒng)的建模分析工具。在描述、模擬、分析系統(tǒng)的順序、沖突、并發(fā)和同步等關系上有著其他模擬分析工具難以比擬的優(yōu)勢。
1 帶抑止弧Petri的概念。定義:一個五元組Σ=(S,T,F,I,M)組成一個帶抑止弧的Petri網(wǎng),(S,T,F)代表一個網(wǎng),其中M表示一個網(wǎng)的標識,I。
2 應用實例。"生產(chǎn)者/消費者"問題是線程同步控制的非常典型的例子,本文的程序中Producer線程負責生產(chǎn)商品,Consumer線程負責在有商品的時候消費商品。PandC類的對象是生產(chǎn)商品線程和消費商品線程共同訪問的商品數(shù)據(jù)。
程序如下:
這個程序沒有對線程進行同步,運行程序時不會出現(xiàn)問題,但是多次運行程序后會陷入死機程序出現(xiàn)錯誤。這個錯誤發(fā)生的幾率很小,錯誤的原因也難以查找。但是依據(jù)上文的建模規(guī)則建立這個程序的Petri網(wǎng)模型,依靠Petri網(wǎng)的理論就能夠分析和定為錯誤。該程序的Petri網(wǎng)模型如圖1,當庫所p8,p14,p15,p16同時都有標記時,Petri網(wǎng)中沒有一個變遷是可以引發(fā),即表示當前狀態(tài)M是一個死標識,end庫所不獲得標記,說明程序不能正常結(jié)束。對應的多線程的執(zhí)行過程是當消費最后一份可消費的商品后要把t.available置為false,但在執(zhí)行t.available=false語句之前,消費商品線程被中斷,系統(tǒng)執(zhí)行了商品生產(chǎn)線程,生產(chǎn)若干商品后,生產(chǎn)商品線程結(jié)束,再調(diào)用消費商品線程并執(zhí)t.available=false語句,最終導致消費商品線程判斷有商品可消費但是t.available=false,消費商品線程陷入死循環(huán),程序不能正確結(jié)束。
這個時候?qū)е鲁绦虺鲥e的原因已經(jīng)找到,只需要對消費商品線程進行同步即可,即使得消費商品線程在執(zhí)行時可以獨占資源。
圖1 程序的Petri網(wǎng)模型
3 結(jié)束語
本文通過抑止弧Petri網(wǎng)模型的運行找到了"生產(chǎn)-消費"程序中用普通方法難以發(fā)現(xiàn)的隱藏的錯誤。而且通過引入抑止弧Petri網(wǎng)的行為分析找到了引發(fā)這個錯誤的原因并提出了該進的方法。
[1]吳哲輝.Petri網(wǎng)導論[M].北京:機械工業(yè)出版社.
[2]鄭莉.C#語言程序設計[M].清華大學出版社.