make loop

This commit is contained in:
chai2010
2016-01-04 21:22:42 +08:00
parent 2a8feaa4a9
commit 15ac30b160

View File

@@ -1,11 +1,11 @@
## 9.6. 競爭條件檢測
使我小心到不能再小心,但在并发程序中犯错还是太容易了。幸的是Go的runtime和工具链为我们装备了一个复杂但好用的动态分析工具,竞争检查器(the race detector)。
使我小心到不能再小心,但在併發程序中犯錯還是太容易了。幸的是Go的runtime和工具鏈爲我們裝備了一個複雜但好用的動態分析工具,競爭檢査器(the race detector)。
要在go buildgo run或者go test命令面加上-race的flag会使编译器创建一你的用的“改”版或者一个附带了能够记录所有行期共享变量访问工具的test并且会记录下每一个读或者共享量的goroutine的身份信息。另外改版的程序会记录下所有的同步事件比如gochannel操作以及(\*sync.Mutex).Lock(\*sync.WaitGroup).Wait等等的用。(完整的同步事件集合是在The Go Memory Model文中有明,该文档是和言文放在一起的。译注https://golang.org/ref/mem)
要在go buildgo run或者go test命令面加上-race的flag會使編譯器創建一你的用的“改”版或者一個附帶了能夠記録所有行期共享變量訪問工具的test併且會記録下每一個讀或者共享量的goroutine的身份信息。另外改版的程序會記録下所有的同步事件比如gochannel操作以及(\*sync.Mutex).Lock(\*sync.WaitGroup).Wait等等的調用。(完整的同步事件集合是在The Go Memory Model文中有明,該文檔是和言文放在一起的。譯註https://golang.org/ref/mem)
竞争检查器会检查这些事件,会寻找在哪一goroutine中出现了这样的case例如其或者了一共享量,这个共享量是被另一goroutine在没有进行干预同步操作便直接入的。这种情况也就表明了是对一个共享量的并发访问,即数据竞争。这个工具打印一份告,容包含量身份,取和入的goroutine中活的函数的调用栈。这些信息在定位问题时通常很有用。9.7节中会有一个竞争检查器的实战样例。
競爭檢査器會檢査這些事件,會尋找在哪一goroutine中出現了這樣的case例如其或者了一共享量,這個共享量是被另一goroutine在沒有進行榦預同步操作便直接入的。這種情況也就表明了是對一個共享量的併發訪問,卽數據競爭。這個工具打印一份告,容包含量身份,取和入的goroutine中活的函數的調用棧。這些信息在定位問題時通常很有用。9.7節中會有一個競爭檢査器的實戰樣例。
竞争检查器会报告所有的已经发生的数据竞争。然而,它只能检测到运行时的竞争条件;不能明之后不会发生数据竞争。所以了使结果尽量正确,请保证你的测试并发地覆到了你到包。
競爭檢査器會報告所有的已經發生的數據競爭。然而,它隻能檢測到運行時的競爭條件;不能明之後不會發生數據競爭。所以了使結果盡量正確,請保證你的測試併發地覆到了你到包。
需要外的记录,因此构建时加了竞争检测的程序跑起来会慢一些,且需要更大的存,即时是这样,这些代价对于很多生产环境的工作来说还是可以接受的。对于一些偶发的竞争条件来说,让竞争检查器来干活可以节省无数日夜的debugging。(译注:多少服端C和C艹程序员为此尽折腰)
需要外的記録,因此構建時加了競爭檢測的程序跑起來會慢一些,且需要更大的存,卽時是這樣,這些代價對於很多生産環境的工作來説還是可以接受的。對於一些偶發的競爭條件來説,讓競爭檢査器來榦活可以節省無數日夜的debugging。(譯註:多少服端C和C艹程序員爲此盡摺腰)