国产gaysexchina男同gay,japanrcep老熟妇乱子伦视频,吃奶呻吟打开双腿做受动态图,成人色网站,国产av一区二区三区最新精品

Go 語(yǔ)言 競(jìng)爭(zhēng)條件檢測(cè)

2023-03-14 16:58 更新

原文鏈接:https://gopl-zh.github.io/ch9/ch9-06.html


9.6. 競(jìng)爭(zhēng)條件檢測(cè)

即使我們小心到不能再小心,但在并發(fā)程序中犯錯(cuò)還是太容易了。幸運(yùn)的是,Go的runtime和工具鏈為我們裝備了一個(gè)復(fù)雜但好用的動(dòng)態(tài)分析工具,競(jìng)爭(zhēng)檢查器(the race detector)。

只要在go build,go run或者go test命令后面加上-race的flag,就會(huì)使編譯器創(chuàng)建一個(gè)你的應(yīng)用的“修改”版或者一個(gè)附帶了能夠記錄所有運(yùn)行期對(duì)共享變量訪問工具的test,并且會(huì)記錄下每一個(gè)讀或者寫共享變量的goroutine的身份信息。另外,修改版的程序會(huì)記錄下所有的同步事件,比如go語(yǔ)句,channel操作,以及對(duì)(*sync.Mutex).Lock(*sync.WaitGroup).Wait等等的調(diào)用。(完整的同步事件集合是在The Go Memory Model文檔中有說明,該文檔是和語(yǔ)言文檔放在一起的。譯注:https://golang.org/ref/mem )

競(jìng)爭(zhēng)檢查器會(huì)檢查這些事件,會(huì)尋找在哪一個(gè)goroutine中出現(xiàn)了這樣的case,例如其讀或者寫了一個(gè)共享變量,這個(gè)共享變量是被另一個(gè)goroutine在沒有進(jìn)行干預(yù)同步操作便直接寫入的。這種情況也就表明了是對(duì)一個(gè)共享變量的并發(fā)訪問,即數(shù)據(jù)競(jìng)爭(zhēng)。這個(gè)工具會(huì)打印一份報(bào)告,內(nèi)容包含變量身份,讀取和寫入的goroutine中活躍的函數(shù)的調(diào)用棧。這些信息在定位問題時(shí)通常很有用。9.7節(jié)中會(huì)有一個(gè)競(jìng)爭(zhēng)檢查器的實(shí)戰(zhàn)樣例。

競(jìng)爭(zhēng)檢查器會(huì)報(bào)告所有的已經(jīng)發(fā)生的數(shù)據(jù)競(jìng)爭(zhēng)。然而,它只能檢測(cè)到運(yùn)行時(shí)的競(jìng)爭(zhēng)條件;并不能證明之后不會(huì)發(fā)生數(shù)據(jù)競(jìng)爭(zhēng)。所以為了使結(jié)果盡量正確,請(qǐng)保證你的測(cè)試并發(fā)地覆蓋到了你的包。

由于需要額外的記錄,因此構(gòu)建時(shí)加了競(jìng)爭(zhēng)檢測(cè)的程序跑起來會(huì)慢一些,且需要更大的內(nèi)存,即使是這樣,這些代價(jià)對(duì)于很多生產(chǎn)環(huán)境的程序(工作)來說還是可以接受的。對(duì)于一些偶發(fā)的競(jìng)爭(zhēng)條件來說,讓競(jìng)爭(zhēng)檢查器來干活可以節(jié)省無數(shù)日夜的debugging。(譯注:多少服務(wù)端C和C++程序員為此競(jìng)折腰。)



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)