下載本文檔
版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026年農(nóng)業(yè)文化遺產(chǎn)活化利用指南
- 煙草制品經(jīng)營(yíng)風(fēng)險(xiǎn)防控管理手冊(cè)
- 2026青龍湖(河北)產(chǎn)業(yè)發(fā)展集團(tuán)有限公司招聘15人備考題庫(kù)及一套參考答案詳解
- 2026年原型設(shè)計(jì)工具高階應(yīng)用培訓(xùn)
- 計(jì)算機(jī)行業(yè)年度策略:AI應(yīng)用加快全球格局重塑中
- 職業(yè)健康風(fēng)險(xiǎn)評(píng)估與員工職業(yè)發(fā)展動(dòng)態(tài)調(diào)整機(jī)制
- 職業(yè)健康促進(jìn)與職業(yè)健康效益優(yōu)化
- 職業(yè)健康與心理健康的整合干預(yù)策略-2
- 陽(yáng)江2025年廣東陽(yáng)江陽(yáng)西縣新墟鎮(zhèn)招聘合同制禁毒工作人員筆試歷年參考題庫(kù)附帶答案詳解
- 邢臺(tái)2025年河北邢臺(tái)市襄都區(qū)招聘中小學(xué)幼兒園教師75人筆試歷年參考題庫(kù)附帶答案詳解
- 云南省玉溪市2025-2026學(xué)年八年級(jí)上學(xué)期1月期末物理試題(原卷版+解析版)
- 2026年哈爾濱通河縣第一批公益性崗位招聘62人考試參考試題及答案解析
- 就業(yè)協(xié)議書(shū)解約函模板
- 研發(fā)部門(mén)員工加班管理細(xì)則
- 鋼結(jié)構(gòu)橋梁施工監(jiān)測(cè)方案
- 2025人教pep版三年級(jí)英語(yǔ)上冊(cè)字帖
- 《5G移動(dòng)通信》課件-項(xiàng)目六 5G網(wǎng)絡(luò)中的人工智能技術(shù)
- 2025江蘇蘇州高新區(qū)獅山商務(wù)創(chuàng)新區(qū)下屬?lài)?guó)有企業(yè)招聘9人筆試題庫(kù)及答案詳解
- 教培機(jī)構(gòu)年終工作總結(jié)
- 2025年秋季青島版三年級(jí)數(shù)學(xué)上冊(cè)求比一個(gè)數(shù)的幾倍多(少)幾的數(shù)教學(xué)課件
- 人才技術(shù)入股公司股權(quán)分配協(xié)議書(shū)
評(píng)論
0/150
提交評(píng)論