<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
上一部分主要寫了鎖,本篇主要介紹Channel
channel是Go中非常重要的一個資料型別,它和goroutine緊密相連,是Go的CSP並行模型的重要體現。
不要通過共用記憶體來通訊,而應該通過通訊來共用記憶體
package main import "fmt" func main() { c := make(chan int) go func() { c <- 1 // 向channel傳送資料 }() x := <-c // 從channel中接收資料 fmt.Println(x) }
1、通過make(chan int)
建立一個int channel(可以在channel初始化時指定緩衝區的大小,例如make(chan int,2)
,不指定則預設為0)
2、在一個goroutine中,通過c<-1
將資料傳送到channel中,<-
可以理解為資料的流動方向。
3、在主goroutine中通過x := <-c
接收channel中的資料,並賦值給x。
既然goroutin和channel分別對應csp中的實體和媒介,goroutin之間都是通過chennel來傳遞資料,那麼是如何保證並行安全的呢?
通過閱讀原始碼可以發現,channel內部是使用Mutext互斥鎖來保證的( 之前也有人提出CAS無鎖Channel的實現,但因為無鎖Channel在多核測試中的表現和沒有滿足FIFO的特性等原因,該提案目前是擱淺狀態)關於無鎖channel的討論
channel的核心原始碼位於runtime包的chan.go中。
hchan 是 channel 在 golang 中的內部實現
type hchan struct { qcount uint // total data in the queue dataqsiz uint // size of the circular queue buf unsafe.Pointer // points to an array of dataqsiz elements elemsize uint16 closed uint32 elemtype *_type // element type sendx uint // send index recvx uint // receive index recvq waitq // list of recv waiters sendq waitq // list of send waiters // lock protects all fields in hchan, as well as several // fields in sudogs blocked on this channel. // // Do not change another G's status while holding this lock // (in particular, do not ready a G), as this can deadlock // with stack shrinking. lock mutex }
hchan的所有屬性大體可以分為3類
1、buffer相關屬性,當channel中的緩衝區大小不為0時,buffer中存放了待接收的資料。
2、waitq相關屬性,即recvq和sendq,可以理解為一個標準的FIFO佇列,recvq是等待接收資料的goroutine,sendq是等待傳送資料的goroutine。
3、其它,例如lock(互斥鎖)、elemtype(元素型別)、closed(channel 是否關閉,== 0 代表未 closed)
hchan的所有行為,基本都是圍繞buffer和waitq來實現的
type waitq struct { first *sudog last *sudog }
waitq是一個雙向連結串列,裡面儲存了goroutine。
buffer使用 ring buffer(環形緩衝區)實現
在hchan中,可以看到 recvx
和sendx
兩個屬性,recvx
即當前已傳送的元素在佇列當中的索引位置,sendx
即 當前已接收的元素在佇列當中的索引位置。
從 recvx
到 sendx
之間的元素,表示已正常存放入 buffer 中的資料。
hchan中的lock
就是一個互斥鎖,channel在傳送和接收資料前,都會先進行加鎖,待邏輯完成後執行再解鎖,來保證並行安全。
以上就是Go保證並行安全底層實現詳解的詳細內容,更多關於Go並行安全底層實現的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45