Go通道channel通過通信共享內存_第1頁
Go通道channel通過通信共享內存_第2頁
Go通道channel通過通信共享內存_第3頁
Go通道channel通過通信共享內存_第4頁
全文預覽已結束

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

第Go通道channel通過通信共享內存目錄引言通道的聲明與創(chuàng)建接收發(fā)送數(shù)據

引言

不要通過共享內存來通信應該通過通信來共享內存

這句話有網友的解釋如下:

這句俏皮話具體說來就是,不同的線程不共享內存不用鎖,線程之間通訊用通道(channel)同步也用channel。

chanel是協(xié)程之間傳遞信息的媒介,優(yōu)雅地解決了某些后端開發(fā)常用語言中隨處可見的lock,unlock,臨界區(qū)等,把從很多線程層面解決的問題移到協(xié)程,從而靜態(tài)地保證沒有數(shù)據競爭。

通道的聲明與創(chuàng)建

偽代碼如下:

//聲明類型

var通道名chan數(shù)據類型

//創(chuàng)建通道

通道名=make(chan數(shù)據類型)

實際例子如下:

packagemain

import"fmt"

funcmain(){

varachanint

fmt.Printf("%T,%v\n",a,a)

ifa==nil{

a=make(chanint)

fmt.Printf("%T,%v\n",a,a)

}

運行結果是:

chanint,nil

chanint,0x1400001a360

通道是一個內存地址,這也說明了其實一個引用類型的數(shù)據。

接收發(fā)送數(shù)據

對于同一個通道來講,他的讀數(shù)據和寫數(shù)據都是阻塞的。

偽代碼如下:

//從通道讀數(shù)據

data:=-a

//把數(shù)據寫入通道

a-data

實際例子如下:

packagemain

import"fmt"

funcmain(){

//首先創(chuàng)建一個bool類型的通道

varch1chanbool

ch1=make(chanbool)

//下面啟動一個goroutine

gofunc(){

fori:=0;i10;i++{

fmt.Println("子goroutine中,i:",i)

fmt.Println("completed")

//循環(huán)結束后向團隊中寫數(shù)據,表示要結束了

ch1-true

//在主程序中讀取數(shù)據

data:=-ch1

//打印一下我們讀到的數(shù)據

fmt.Println("maindata:",data)

fmt.Println("maingoroutinecompleted")

}

運行結果如下:

子goroutine中,i:0

子goroutine中,i:1

子goroutine中,i:2

子goroutine中,i:3

子goroutine中,i:4

子goroutine中,i:5

子goroutine中,i:6

子goroutine中,i:7

子goroutine中,i:8

子goroutine中,i:9

completed

maindata:true

maingoroutinecompleted

我們的子goroutine里面循環(huán)打印1~10,打印完成之后把chanel類型的ch1寫為true,

這時候,主goroutine就可以根據這一條件進行下一步了,,在此之前,其實就算主goroutine先搶到了資源,從ch1中讀取數(shù)據,但是現(xiàn)在通道里面啥都沒有,只能阻塞,然后乖乖交出資源給我們的子goroutine,直到循環(huán)結束寫true入ch1。

需要注意的有以下幾點:

chanel是需要指定類型的nil類型的chanel不能直接使用。chanel本身是同步的,同一時間只能有一條goroutine進行操作。chanel是goroutine之間傳遞數(shù)據用的,chanel數(shù)據的發(fā)送和接收必須在不同的goroutine中,如果只有一條goroutine是用不上chanel的,這種情況會發(fā)生死鎖(deadLock)。從chanel里面讀數(shù)據立馬就會被阻塞,直到有向chanel寫數(shù)據的goroutine來。向chanel里面寫數(shù)據立馬就會被阻塞,直到有從chanel讀數(shù)據的goroutine來。

(以上都是相對于沒有緩存的通道而

溫馨提示

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

評論

0/150

提交評論