golang裡channel的實現原理

2021-06-20 00:00:24 字數 1539 閱讀 4715

channel是訊息傳遞的機制,用於多執行緒環境下lock free synchronization.

它同時具備2個特性:

1. 訊息傳遞

2. 同步

golang裡的channel的效能,可以參考前一篇:

此外,自帶的runtime package裡已經提供了benchmark**,可以執行下面的命令檢視其效能:

go test -v -test.bench=".*" runtime

在我的pc上的結果是:

benchmarkchanuncontended

50000000  

67.3 ns/op

benchmarkchancontended  

50000000  

67.7 ns/op

benchmarkchansync  

10000000  

181 ns/op

benchmarkchanprodcons0  

10000000  

198 ns/op

benchmarkchanprodcons10  

20000000  

98.2 ns/op

benchmarkchanprodcons100

50000000  

73.4 ns/op

benchmarkchanprodconswor

k0  

1000000  

1874 ns/op

benchmarkchanprodconswor

k10  

1000000  

1805 ns/op

benchmarkchanprodconswor

k100  

1000000  

1771 ns/op

benchmarkchancreation  

10000000  

195 ns/op

benchmarkchansem  

50000000  

66.3 ns/op

channel的實現,都在$goroot/src/pkg/runtime/chan.c裡

它是通過共享記憶體實現的

struct hchan

ch := make(chan inte***ce{}, 5)

具體的實現是chan.c裡的 hchan* runtime·makechan_c(chantype *t, int64 hint)

此時,hint=5, t=inte***ce{}

它完成的任務就是:

分配hint * sizeof(t) + sizeof(hchan)的記憶體空間[也就是說,buffered chan的buffer越大,占用

記憶體越大]

ch <- 5

就會呼叫 void runtime·chansend(chantype *t, hchan *chan, byte *ep, bool *pres)

lock(chan)

如果chan是buffer chan else

} else

golang中channel的用法

go語言的range迴圈可以直接在channels上面迭代。使用range迴圈一次從channel中接受資料,當channel被關閉並且沒有值可接受時跳出循壞。func main close natures go func close squares for x range squares 雙向ch...

Golang 有趣的 channel 應用

嚴格意義上說,本文是我另外一片文章 golang funny play with channel 的中文版本。不過,畢竟是用中文當母語的,所以就不翻譯了,重新按照那個內容寫過吧。channel 是 golang 裡相當有趣的乙個功能,在我使用 golang 編碼的經驗裡,大部分事件都會是在享受 ch...

golang中channel的用法

channel有點類似於管道,它在goroutine同步與通訊中,有著起承轉合的作用,同時也是golang實現csp模型的關鍵 package main func main 以下是channel的一些使用場景 等待goroutine完成 package main func main println ...