最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Go保證并發(fā)安全底層實現(xiàn)詳解

 更新時間:2022年09月02日 09:16:32   作者:Sundar84034  
這篇文章主要為大家介紹了Go保證并發(fā)安全底層實現(xiàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

引言

上一部分主要寫了鎖,本篇主要介紹Channel

channel是Go中非常重要的一個數(shù)據(jù)類型,它和goroutine緊密相連,是Go的CSP并發(fā)模型的重要體現(xiàn)。

CSP

  • CSP 是通信順序進程(Communicating Sequential Process)的簡稱,是一種并發(fā)編程模型。
  • 簡單來說,CSP模型由并發(fā)的實體所組成,實體之間通過發(fā)送消息進行通信,而發(fā)送消息使用的就是通道,即channel。
  • GO實現(xiàn)了CSP部分理論,goroutine對應CSP中的并發(fā)執(zhí)行的實體,channel對應CSP中的channel。

不要通過共享內(nèi)存來通信,而應該通過通信來共享內(nèi)存

Channel的基本使用

package main
import "fmt"
func main() {
	c := make(chan int)
	go func() {
		c <- 1 // 向channel發(fā)送數(shù)據(jù)
	}()
	x := <-c // 從channel中接收數(shù)據(jù)
	fmt.Println(x)
}

1、通過make(chan int)創(chuàng)建一個int channel(可以在channel初始化時指定緩沖區(qū)的大小,例如make(chan int,2),不指定則默認為0)

2、在一個goroutine中,通過c<-1將數(shù)據(jù)發(fā)送到channel中,<-可以理解為數(shù)據(jù)的流動方向。

3、在主goroutine中通過x := <-c接收channel中的數(shù)據(jù),并賦值給x。

channel如何保證并發(fā)安全

既然goroutin和channel分別對應csp中的實體和媒介,goroutin之間都是通過chennel來傳遞數(shù)據(jù),那么是如何保證并發(fā)安全的呢?

通過閱讀源碼可以發(fā)現(xiàn),channel內(nèi)部是使用Mutext互斥鎖來保證的( 之前也有人提出CAS無鎖Channel的實現(xiàn),但因為無鎖Channel在多核測試中的表現(xiàn)和沒有滿足FIFO的特性等原因,該提案目前是擱淺狀態(tài))關(guān)于無鎖channel的討論

channel的底層實現(xiàn)

channel的核心源碼位于runtime包的chan.go中。

hchan 是 channel 在 golang 中的內(nèi)部實現(xiàn)

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相關(guān)屬性,當channel中的緩沖區(qū)大小不為0時,buffer中存放了待接收的數(shù)據(jù)。

2、waitq相關(guān)屬性,即recvq和sendq,可以理解為一個標準的FIFO隊列,recvq是等待接收數(shù)據(jù)的goroutine,sendq是等待發(fā)送數(shù)據(jù)的goroutine。

3、其它,例如lock(互斥鎖)、elemtype(元素類型)、closed(channel 是否關(guān)閉,== 0 代表未 closed)

hchan的所有行為,基本都是圍繞bufferwaitq來實現(xiàn)的

waitq

type waitq struct { 
 first *sudog 
 last *sudog 
 } 

waitq是一個雙向鏈表,里面保存了goroutine。

buffe

buffer使用 ring buffer(環(huán)形緩沖區(qū))實現(xiàn)

在hchan中,可以看到 recvxsendx 兩個屬性,recvx即當前已發(fā)送的元素在隊列當中的索引位置,sendx 即 當前已接收的元素在隊列當中的索引位置。

從 recvx 到 sendx 之間的元素,表示已正常存放入 buffer 中的數(shù)據(jù)。

Lock

hchan中的lock就是一個互斥鎖,channel在發(fā)送和接收數(shù)據(jù)前,都會先進行加鎖,待邏輯完成后執(zhí)行再解鎖,來保證并發(fā)安全。

以上就是Go保證并發(fā)安全底層實現(xiàn)詳解的詳細內(nèi)容,更多關(guān)于Go并發(fā)安全底層實現(xiàn)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 一文帶你感受Go語言空結(jié)構(gòu)體的魔力

    一文帶你感受Go語言空結(jié)構(gòu)體的魔力

    在?Go?語言中,有一種特殊的用法可能讓許多人感到困惑,那就是空結(jié)構(gòu)體,本文將對Go空結(jié)構(gòu)體進行詳解,準備一杯你最喜歡的飲料或茶,隨著本文一探究竟吧
    2023-05-05
  • goland遠程調(diào)試k8s上容器的實現(xiàn)

    goland遠程調(diào)試k8s上容器的實現(xiàn)

    本文主要介紹了goland遠程調(diào)試k8s上容器的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • Golang并發(fā)編程之main goroutine的創(chuàng)建與調(diào)度詳解

    Golang并發(fā)編程之main goroutine的創(chuàng)建與調(diào)度詳解

    這篇文章主要為大家詳細介紹了Golang并發(fā)編程中main goroutine的創(chuàng)建與調(diào)度,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下
    2023-03-03
  • idea搭建go環(huán)境實現(xiàn)go語言開發(fā)

    idea搭建go環(huán)境實現(xiàn)go語言開發(fā)

    這篇文章主要給大家介紹了關(guān)于idea搭建go環(huán)境實現(xiàn)go語言開發(fā)的相關(guān)資料,文中通過圖文介紹以及代碼介紹的非常詳細,對大家學習或者使用go具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-01-01
  • go中string、int、float相互轉(zhuǎn)換方式

    go中string、int、float相互轉(zhuǎn)換方式

    這篇文章主要介紹了go中string、int、float相互轉(zhuǎn)換方式,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-07-07
  • Golang二進制反匯編問題

    Golang二進制反匯編問題

    這篇文章主要介紹了Golang二進制反匯編問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-11-11
  • Golang空接口與類型斷言的實現(xiàn)

    Golang空接口與類型斷言的實現(xiàn)

    本文主要介紹了Golang空接口與類型斷言的實現(xiàn),文中根據(jù)實例編碼詳細介紹的十分詳盡,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

    搭建Go語言的ORM框架Gorm的具體步驟(從Java到go)

    很多朋友不知道如何使用Goland軟件,搭建一個ORM框架GORM,今天小編給大家分享一篇教程關(guān)于搭建Go語言的ORM框架Gorm的具體步驟(從Java到go),感興趣的朋友跟隨小編一起學習下吧
    2022-09-09
  • Golang連接池的幾種實現(xiàn)案例小結(jié)

    Golang連接池的幾種實現(xiàn)案例小結(jié)

    這篇文章主要介紹了Golang連接池的幾種實現(xiàn)案例小結(jié),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • goland設置控制臺折疊效果

    goland設置控制臺折疊效果

    這篇文章主要介紹了goland設置控制臺折疊效果,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-12-12

最新評論

五原县| 乌审旗| 阿克苏市| 长子县| 舟山市| 诏安县| 呼图壁县| 西乌珠穆沁旗| 绥德县| 扶余县| 祁东县| 泰州市| 上蔡县| 梁平县| 龙泉市| 乐山市| 乌鲁木齐县| 沁水县| 辉南县| 昌图县| 阿瓦提县| 临邑县| 历史| 安义县| 综艺| 鹿邑县| 临潭县| 昌平区| 洞头县| 伽师县| 中宁县| 张家港市| 衡水市| 深圳市| 金湖县| 洛隆县| 宣汉县| 泸溪县| 莎车县| 罗江县| 霸州市|