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