陳麗特
(安徽理工大學 計算機科學與工程學院,安徽 淮南 232001)
引言。在單個程序里面同時運行多個線程來完成不同任務,稱為多線程。多線程主要目的是為了節約CPU時間,提高CUP的利用率。但多線程會給程序帶來更多難以發現的bug。Petri是一種功能強大的分布式系統的建模分析工具。在描述、模擬、分析系統的順序、沖突、并發和同步等關系上有著其他模擬分析工具難以比擬的優勢。
1 帶抑止弧Petri的概念。定義:一個五元組Σ=(S,T,F,I,M)組成一個帶抑止弧的Petri網,(S,T,F)代表一個網,其中M表示一個網的標識,I。
2 應用實例。"生產者/消費者"問題是線程同步控制的非常典型的例子,本文的程序中Producer線程負責生產商品,Consumer線程負責在有商品的時候消費商品。PandC類的對象是生產商品線程和消費商品線程共同訪問的商品數據。
程序如下:




這個程序沒有對線程進行同步,運行程序時不會出現問題,但是多次運行程序后會陷入死機程序出現錯誤。這個錯誤發生的幾率很小,錯誤的原因也難以查找。但是依據上文的建模規則建立這個程序的Petri網模型,依靠Petri網的理論就能夠分析和定為錯誤。該程序的Petri網模型如圖1,當庫所p8,p14,p15,p16同時都有標記時,Petri網中沒有一個變遷是可以引發,即表示當前狀態M是一個死標識,end庫所不獲得標記,說明程序不能正常結束。對應的多線程的執行過程是當消費最后一份可消費的商品后要把t.available置為false,但在執行t.available=false語句之前,消費商品線程被中斷,系統執行了商品生產線程,生產若干商品后,生產商品線程結束,再調用消費商品線程并執t.available=false語句,最終導致消費商品線程判斷有商品可消費但是t.available=false,消費商品線程陷入死循環,程序不能正確結束。
這個時候導致程序出錯的原因已經找到,只需要對消費商品線程進行同步即可,即使得消費商品線程在執行時可以獨占資源。

圖1 程序的Petri網模型
3 結束語
本文通過抑止弧Petri網模型的運行找到了"生產-消費"程序中用普通方法難以發現的隱藏的錯誤。而且通過引入抑止弧Petri網的行為分析找到了引發這個錯誤的原因并提出了該進的方法。
[1]吳哲輝.Petri網導論[M].北京:機械工業出版社.
[2]鄭莉.C#語言程序設計[M].清華大學出版社.