成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

徹底搞懂Channel原理之一

開發 后端
這篇我們主要介紹了如何獲取go程序的匯編代碼,通過匯編代碼知道創建channel的具體函數runtime.makechan。同時我們還知道不同的創建姿勢會導致走向不同的內存空間分配邏輯。

[[427854]]

本文轉載自微信公眾號「吳親強的深夜食堂」,作者吳親庫里。轉載本文請聯系吳親強的深夜食堂公眾號。

 躺的太久,該起床了。

寧可我卷死別人,不能讓別人卷我。

之前斷斷續續看過Go幾個模塊的源碼,可從未下筆,導致有些細節記不起來了。打算寫一系列文章重新記錄。

channel源碼解析的文章太多了。一篇文章的長篇大論大部分人沒耐心看完,所以我打算分開寫,最后附上完整的ppt。

當然這其中不會涉及過多細節源碼,因為有時候,細節是魔鬼。

介紹

channel一些基礎介紹這里就不過多涉及了,都1202年了,我不相信用過Go的人沒用過channel。

當然下圖也涵蓋了大部分使用姿勢。

有一道使用channel進行任務編排的經典的題。題目如下:

有四個goroutine,編號為 1、2、3、4。每秒鐘會有一個 goroutine打印自己的編號。請你實現這個程序,讓輸出的編號總是按照 1、2、3、4、1、2、3、4、……的順序打印出來。就像這樣,

可以自己先思考下,代碼也可以通過后臺回復擊鼓傳花獲取。

原理解析

從一個簡單的例子說起。

創建一個main.go文件,代碼如下,

我們來看看這段代碼編譯以后長啥樣。

想得到go程序的匯編代碼并不難。

可以使用go tool compile -N -l -S main.go生成匯編代碼:

或者使用go tool compile -N -l main.go先編譯出代碼,然后再使用go tool objdump main.o反匯編出代碼。

還可以通過go build -gcflags -S main.go同樣可以得到匯編的代碼。

上面兩種我就不演示了,可以自行實驗。他們之中flag的具體含義也可以自行了解。

如果你覺得上面要自己敲代碼比較麻煩,我推薦一個更加直接可視化的工具。

綜上,從編譯的代碼我們可以看出,上述初始化一個channel,實際上調用的是runtime.makechan。

  1. ch := make(chan struct{}) 

圖片從函數中,我們能知道最終返回一個runtime.hchan的指針。

runtime.hchan結構。

我們先來解釋hchan結構體各個字段的含義,之后在案例介紹中會更加詳細的說明他們的作用。

先來看qcount和dataqsiz有什么區別?

你去銀行辦事,銀行有5個辦事窗口,那么dataqsiz就等于5。在這里體現的是channel的容量為5。去銀行的時候,當前有3個窗口有人正在辦事,那么qcount就等于3,體現channel當前有3個數據元素。那么此時銀行還可以再接待2個客戶,對應還可以往channel發送2個數據元素。

其他字段現在看看說明就行了,后面會細講。

到這里我們就知道創建一個channel本質上就是得到一個runtime.hchan的指針,后續對此chan的操作,無非就是對結構體字段進行相對應的操作。

同時我們也能猜出,為啥channel能在不同的g中傳遞消息,而對于使用者來說不用擔心并發的問題。

其實就是hchan內部使用互斥鎖來保證了并發安全。

最后我們來看一下runtime.makechan函數核心實現,當然注釋已經很明白了。

可以看到創建的時候有一段switch分支代碼,那么什么情況下會走對應的case呢?

根據上面的信息,我們可以得出,

  • 如果創建一個無緩沖channel ,那么只需要為runtime.hchan本身分配一段內存空間即可。
  • 如果創建的緩沖channel存儲的類型不是指針類型,會為當前channel和存儲類型元素的緩沖區,分配一塊連續的內存空間。
  • 在默認情況下(緩沖channel存儲類型包含指針),會單獨為runtime.hchan和緩沖區分配內存。

總結

這篇我們主要介紹了如何獲取go程序的匯編代碼,通過匯編代碼知道創建channel的具體函數runtime.makechan。

同時我們還知道不同的創建姿勢會導致走向不同的內存空間分配邏輯。

最后通過創建函數我們知道channel在程序運行時是使用runtime.hchan來表示。

下一篇我們繼續。

 

責任編輯:武曉燕 來源: 吳親強的深夜食堂
相關推薦

2021-10-11 11:58:41

Channel原理recvq

2021-07-08 10:08:03

DvaJS前端Dva

2023-04-12 08:38:44

函數參數Context

2023-10-18 10:55:55

HashMap

2023-05-29 08:12:38

2022-08-26 13:24:03

version源碼sources

2022-04-24 11:06:54

SpringBootjar代碼

2021-07-16 11:35:20

Java線程池代碼

2021-08-18 23:10:56

setState代碼性能

2019-07-23 08:55:46

Base64編碼底層

2024-10-15 17:12:38

代碼父子線程開源

2020-12-07 06:19:50

監控前端用戶

2021-06-30 08:45:02

內存管理面試

2022-06-07 10:13:22

前端沙箱對象

2020-03-18 14:00:47

MySQL分區數據庫

2021-07-21 05:24:32

EventBus3.0Android單例模式

2021-02-01 11:30:13

React前端調度

2025-04-21 04:00:00

2020-04-28 22:12:30

Nginx正向代理反向代理

2019-11-06 17:30:57

cookiesessionWeb
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 精品国产乱码久久久久久图片 | 久久国产精品网站 | 久久久精品视频免费 | 亚洲国产精品久久 | 欧美日韩综合精品 | 亚洲精品在线观看视频 | 精品久久九 | 99视频网站| 亚洲国产成人久久综合一区,久久久国产99 | 日韩一区二区三区在线 | 亚洲视频免费观看 | 国产国产精品 | 欧美日韩一二三区 | av在线一区二区三区 | 在线国产视频 | 亚洲精品68久久久一区 | 亚洲二区视频 | 国产亚洲精品综合一区 | 欧美久久一区 | 欧美一区中文字幕 | 精品国产鲁一鲁一区二区张丽 | 亚洲欧美日韩在线 | 国产日韩免费观看 | 国产欧美视频一区 | 国产欧美视频一区二区三区 | 人人干人人草 | 99成人在线视频 | 欧美性久久| 亚洲免费毛片 | 欧美在线a | 国产精品一码二码三码在线 | 亚洲精品一区二区三区四区高清 | 日韩在线国产 | av在线播放一区二区 | 日韩精品一区二区三区视频播放 | 在线视频成人 | 亚洲精品一区二区三区蜜桃久 | www.日韩在线| 亚洲欧洲日韩精品 中文字幕 | 亚洲精品一区二区在线 | 色精品视频|