Go保證并發(fā)安全底層實(shí)現(xiàn)詳解_第1頁(yè)
Go保證并發(fā)安全底層實(shí)現(xiàn)詳解_第2頁(yè)
Go保證并發(fā)安全底層實(shí)現(xiàn)詳解_第3頁(yè)
Go保證并發(fā)安全底層實(shí)現(xiàn)詳解_第4頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

第Go保證并發(fā)安全底層實(shí)現(xiàn)詳解目錄引言CSPChannel的基本使用channel如何保證并發(fā)安全channel的底層實(shí)現(xiàn)waitqbuffeLock

引言

上一部分主要寫(xiě)了鎖,本篇主要介紹Channel

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

CSP

CSP是通信順序進(jìn)程(CommunicatingSequentialProcess)的簡(jiǎn)稱(chēng),是一種并發(fā)編程模型。簡(jiǎn)單來(lái)說(shuō),CSP模型由并發(fā)的實(shí)體所組成,實(shí)體之間通過(guò)發(fā)送消息進(jìn)行通信,而發(fā)送消息使用的就是通道,即channel。GO實(shí)現(xiàn)了CSP部分理論,goroutine對(duì)應(yīng)CSP中的并發(fā)執(zhí)行的實(shí)體,channel對(duì)應(yīng)CSP中的channel。

不要通過(guò)共享內(nèi)存來(lái)通信,而應(yīng)該通過(guò)通信來(lái)共享內(nèi)存

Channel的基本使用

packagemain

import"fmt"

funcmain(){

c:=make(chanint)

gofunc(){

c-1//向channel發(fā)送數(shù)據(jù)

x:=-c//從channel中接收數(shù)據(jù)

fmt.Println(x)

1、通過(guò)make(chanint)創(chuàng)建一個(gè)intchannel(可以在channel初始化時(shí)指定緩沖區(qū)的大小,例如make(chanint,2),不指定則默認(rèn)為0)

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

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

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

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

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

channel的底層實(shí)現(xiàn)

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

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

typehchanstruct{

qcountuint//totaldatainthequeue

dataqsizuint//sizeofthecircularqueue

bufunsafe.Pointer//pointstoanarrayofdataqsizelements

elemsizeuint16

closeduint32

elemtype*_type//elementtype

sendxuint//sendindex

recvxuint//receiveindex

recvqwaitq//listofrecvwaiters

sendqwaitq//listofsendwaiters

//lockprotectsallfieldsinhchan,aswellasseveral

//fieldsinsudogsblockedonthischannel.

//DonotchangeanotherG'sstatuswhileholdingthislock

//(inparticular,donotreadyaG),asthiscandeadlock

//withstackshrinking.

lockmutex

hchan的所有屬性大體可以分為3類(lèi)

1、buffer相關(guān)屬性,當(dāng)channel中的緩沖區(qū)大小不為0時(shí),buffer中存放了待接收的數(shù)據(jù)。

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

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

hchan的所有行為,基本都是圍繞buffer和waitq來(lái)實(shí)現(xiàn)的

waitq

typewaitqstruct{

first*sudog

last*sudog

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

buffe

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

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

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

Lock

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論