go channel

go version:1.12.5
文件 :src/runtime/chan.go

先分析下管道的結(jié)構(gòu)體

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 mutex
}
  • qcount
    當(dāng)前隊(duì)列中剩余的元素個(gè)數(shù)

  • dataqsize
    環(huán)形隊(duì)列長(zhǎng)度,即可以存放的元素個(gè)數(shù)

  • buf
    指向隊(duì)列的內(nèi)存,環(huán)形隊(duì)列的指針

  • elemsize
    每個(gè)元素的大小

  • closed
    標(biāo)識(shí)關(guān)閉狀態(tài)

  • elemtype
    元素類(lèi)型

  • sendx
    隊(duì)列下標(biāo),指示元素寫(xiě)入時(shí)存放到隊(duì)列中的位置,即隊(duì)尾

  • recvx
    隊(duì)列下標(biāo),指示下一個(gè)被讀取的元素在隊(duì)列中的位置,即隊(duì)首

  • recvq
    等待讀消息的協(xié)程隊(duì)列,讀取數(shù)據(jù)時(shí),如果管道緩沖區(qū)為空或沒(méi)有緩沖區(qū),則當(dāng)前協(xié)程會(huì)被阻塞,并被加入recvq隊(duì)列.

  • sendq
    等待寫(xiě)消息的協(xié)程隊(duì)列,向管道寫(xiě)入數(shù)據(jù)時(shí),如果管道緩沖區(qū)已滿或沒(méi)有緩沖區(qū),則當(dāng)前協(xié)程會(huì)被阻塞,并被加入sendq隊(duì)列.

  • lock mutex
    互斥鎖, chan不允許并發(fā)讀寫(xiě),即一個(gè)管道同時(shí)僅允許被一個(gè)協(xié)程讀寫(xiě).

  • 注意: sendqrecvq中的至少一個(gè)為空狼渊,但使用select發(fā)送和接收的無(wú)緩沖通道上阻塞了單個(gè)goroutine的情況除外躏筏,在這種情況下,sendq的長(zhǎng)度而recvq僅受select語(yǔ)句的大小限制.
    即:同一個(gè)協(xié)程使用select語(yǔ)句向管道一邊寫(xiě)入一邊讀取,此時(shí)協(xié)程會(huì)分別位于兩個(gè)隊(duì)列
    qcount> 0表示recvq為空.
    qcount <dataqsiz表示sendq為空.

看圖中結(jié)構(gòu)體數(shù)據(jù)變化


image.png
image.png

執(zhí)行邏輯

  • 向channel寫(xiě)入數(shù)據(jù)


    image.png
  • 從channel中讀取數(shù)據(jù)


    image.png

參考《GO專家編程》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市良瞧,隨后出現(xiàn)的幾起案子讯榕,更是在濱河造成了極大的恐慌蚊惯,老刑警劉巖吆倦,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異抄瓦,居然都是意外死亡潮瓶,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)钙姊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)毯辅,“玉大人,你說(shuō)我怎么就攤上這事摸恍∠ず保” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵立镶,是天一觀的道長(zhǎng)壁袄。 經(jīng)常有香客問(wèn)我,道長(zhǎng)媚媒,這世上最難降的妖魔是什么嗜逻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮缭召,結(jié)果婚禮上栈顷,老公的妹妹穿的比我還像新娘。我一直安慰自己嵌巷,他們只是感情好萄凤,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搪哪,像睡著了一般靡努。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,718評(píng)論 1 305
  • 那天惑朦,我揣著相機(jī)與錄音兽泄,去河邊找鬼。 笑死漾月,一個(gè)胖子當(dāng)著我的面吹牛病梢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梁肿,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼蜓陌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吩蔑?” 一聲冷哼從身側(cè)響起护奈,我...
    開(kāi)封第一講書(shū)人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎哥纫,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體痴奏,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛀骇,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了读拆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片擅憔。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖檐晕,靈堂內(nèi)的尸體忽然破棺而出暑诸,到底是詐尸還是另有隱情,我是刑警寧澤辟灰,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布个榕,位于F島的核電站,受9級(jí)特大地震影響芥喇,放射性物質(zhì)發(fā)生泄漏西采。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一继控、第九天 我趴在偏房一處隱蔽的房頂上張望械馆。 院中可真熱鬧,春花似錦武通、人聲如沸霹崎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)尾菇。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間错沽,已是汗流浹背簿晓。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留千埃,地道東北人憔儿。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像放可,于是被迫代替她去往敵國(guó)和親谒臼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • channel一個(gè)類(lèi)型管道耀里,通過(guò)它可以在goroutine之間發(fā)送和接收消息蜈缤。它是Golang在語(yǔ)言層面提供的go...
    蔡欣圻閱讀 13,518評(píng)論 4 11
  • 了解過(guò)go的都知道,go最為突出的優(yōu)點(diǎn)就是它天然支持高并發(fā)冯挎,但是所有高并發(fā)情況都面臨著一個(gè)很明顯的問(wèn)題底哥,就是并發(fā)的...
    GGBond_8488閱讀 334評(píng)論 0 3
  • 先看下源碼,源碼位于src/runtime/chan.go中 qcount uint // 當(dāng)前隊(duì)列中剩余元素個(gè)數(shù)...
    stevenyeahnet閱讀 314評(píng)論 0 0
  • 由淺入深剖析 go channel channel 是 golang 中最核心的 feature 之一房官,因此理解 ...
    不智魚(yú)閱讀 59,739評(píng)論 4 83
  • 久違的晴天趾徽,家長(zhǎng)會(huì)。 家長(zhǎng)大會(huì)開(kāi)好到教室時(shí)翰守,離放學(xué)已經(jīng)沒(méi)多少時(shí)間了孵奶。班主任說(shuō)已經(jīng)安排了三個(gè)家長(zhǎng)分享經(jīng)驗(yàn)。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,523評(píng)論 16 22