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

Go?channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程詳解

 更新時間:2023年05月04日 16:02:56   作者:CCSU__LRF  
這篇文章主要介紹了Go?channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
  • 簡而言之,channel維護(hù)了一個帶指針的接受和發(fā)送的隊列,其中包含mutex鎖保證并發(fā)安全,數(shù)據(jù)類型,元素個數(shù),元素大小,channel狀態(tài)
  • 然后讀寫操作,先看隊列是否可以取出,然后看緩沖區(qū),最后放入接受/發(fā)送隊列
  • 關(guān)閉就是喚醒所有g(shù)oroutine然后將他們的標(biāo)志位設(shè)為1,表示關(guān)閉,以后有人訪問就是nil

結(jié)構(gòu)體源碼

type hchan struct {
    qcount   uint           // 當(dāng)前隊列中元素的數(shù)量
    dataqsiz uint           // 緩沖區(qū)大小,即可以緩存的元素數(shù)量
    buf      unsafe.Pointer // 指向隊列的緩沖區(qū)
    elemsize uint16         // 每個元素的大小
    closed   uint32         // channel 是否已關(guān)閉的標(biāo)志
    elemtype *_type         // channel 中元素的類型
    sendx    uint           // 下一次發(fā)送元素的位置
    recvx    uint           // 下一次接收元素的位置
    recvq    waitq          // 等待接收的 goroutine 隊列
    sendq    waitq          // 等待發(fā)送的 goroutine 隊列
    lock     mutex          // 用于保護(hù) channel 的互斥鎖
}

發(fā)送數(shù)據(jù)

當(dāng)一個 goroutine 要向 channel 中發(fā)送數(shù)據(jù)時,它會執(zhí)行 chansend 函數(shù)。

  • 這個函數(shù)首先會對 channel 進(jìn)行加鎖,然后判斷是否有等待接收的 goroutine
  • 如果有,則直接將數(shù)據(jù)發(fā)送給它;否則,如果緩沖區(qū)未滿,則將數(shù)據(jù)放入緩沖區(qū),隊列中元素數(shù)量加一;
  • 如果隊列已滿,則將當(dāng)前 goroutine 加入等待發(fā)送的 goroutine 隊列中,并阻塞它,等待其他 goroutine 接收數(shù)據(jù)。

接受數(shù)據(jù)

當(dāng)一個 goroutine 要從 channel 中接收數(shù)據(jù)時,它會執(zhí)行 src/runtime/chan.go 中的 chanrecv 函數(shù)。

  • 這個函數(shù)也會對 channel 進(jìn)行加鎖,然后判斷是否有等待發(fā)送的 goroutine,如果有,則直接從它那里接收數(shù)據(jù);
  • 否則,如果緩沖區(qū)元素的數(shù)量大于 0,則從緩沖區(qū)中取出一個元素,并將隊列中元素數(shù)量減一。
  • 如果緩沖區(qū)為空,則將當(dāng)前 goroutine 加入等待接收的 goroutine 隊列中,并阻塞它,等待其他 goroutine 發(fā)送數(shù)據(jù)。

關(guān)閉channel

當(dāng)一個 goroutine 要關(guān)閉 channel 時,它會執(zhí)行 src/runtime/chan.go 中的 closechan 函數(shù)。

  • 這個函數(shù)會對 channel 進(jìn)行加鎖,然后將 closed 標(biāo)志置為 1,表示 channel 已經(jīng)關(guān)閉。
  • 然后遍歷等待發(fā)送和等待接收的 goroutine 隊列,將它們?nèi)繂拘眩⒎祷匾粋€特殊的值來表示 channel 已經(jīng)關(guān)閉。

到此這篇關(guān)于Go channel結(jié)構(gòu)體源碼和讀寫和關(guān)閉過程的文章就介紹到這了,更多相關(guān)go channel結(jié)構(gòu)體源碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Go語言實(shí)現(xiàn)簡單聊天系統(tǒng)

    使用Go語言實(shí)現(xiàn)簡單聊天系統(tǒng)

    本文介紹了如何使用Go語言和WebSocket技術(shù)構(gòu)建一個簡單的多人聊天室系統(tǒng),包括客戶端連接管理、消息廣播和并發(fā)處理,最后,通過編寫main.go、hub.go和client.go等核心代碼模塊,具有一定的參考價值,感興趣的可以了解一下
    2024-10-10
  • 一文帶你吃透Golang中的類型轉(zhuǎn)換

    一文帶你吃透Golang中的類型轉(zhuǎn)換

    Golang是一種強(qiáng)類型語言,所以Golang的類型轉(zhuǎn)換和C/C++ java等語言的類型轉(zhuǎn)換還有點(diǎn)區(qū)別,本文講通過一些簡單的示例帶大家深入了解一下Golang中的類型轉(zhuǎn)換,需要的可以參考下
    2023-05-05
  • 解決golang內(nèi)存溢出的方法

    解決golang內(nèi)存溢出的方法

    這篇文章主要介紹了解決golang內(nèi)存溢出的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • k8s容器互聯(lián)flannel?vxlan通信原理

    k8s容器互聯(lián)flannel?vxlan通信原理

    這篇文章主要為大家介紹了k8s容器互聯(lián)flannel?vxlan通信原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解)

    Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解)

    這篇文章主要介紹了Go基于GORM 獲取當(dāng)前請求所執(zhí)行的 SQL 信息(思路詳解),本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • golang panic及處理機(jī)制

    golang panic及處理機(jī)制

    Go語言追求簡潔優(yōu)雅,所以,Go語言不支持傳統(tǒng)的 try…catch…finally 這種異常,因?yàn)镚o語言的設(shè)計者們認(rèn)為,將異常與控制結(jié)構(gòu)混在一起會很容易使得代碼變得混亂,今天給大家介紹golang panic及處理機(jī)制,需要的朋友參考下吧
    2021-08-08
  • Golang實(shí)現(xiàn)Directional Channel(定向通道)

    Golang實(shí)現(xiàn)Directional Channel(定向通道)

    這篇文章主要介紹了Golang實(shí)現(xiàn)Directional Channel(定向通道),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • Go簡單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例

    Go簡單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例

    本文主要介紹了Go簡單實(shí)現(xiàn)協(xié)程池的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Go語言web框架Gin響應(yīng)客戶端的方式

    Go語言web框架Gin響應(yīng)客戶端的方式

    Gin是一個用Go語言編寫的web框架,它是一個類似于martini但擁有更好性能的API框架, 由于使用了httprouter,速度提高了近40倍,本文給大家介紹了Go語言web框架Gin響應(yīng)客戶端有哪些方式,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-10-10
  • Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go1.21新增內(nèi)置函數(shù)(built-in?functions)詳解

    Go?1.21新增的內(nèi)置函數(shù)分別是?min、max?和?clear,這篇文章主要帶大家一起了解一下這幾個函數(shù)的用途和使用示例,感興趣的小伙伴可以學(xué)習(xí)一下
    2023-08-08

最新評論

肥西县| 南投市| 东平县| 万全县| 新建县| 马鞍山市| 青海省| 丹寨县| 二连浩特市| 乌兰县| 民丰县| 盘锦市| 潮安县| 漳浦县| 什邡市| 嘉祥县| 兴隆县| 长武县| 哈尔滨市| 汶上县| 卓资县| 天长市| 阜康市| 许昌市| 汝城县| 南投市| 南康市| 玉溪市| 吕梁市| 石柱| 奉化市| 孝感市| 名山县| 崇信县| 灌南县| 民权县| 论坛| 齐齐哈尔市| 乡城县| 南召县| 蕲春县|