GO channel實現同步

2022-08-31 01:33:12 字數 813 閱讀 3450

goroutine執行在相同的位址空間,因此訪問共享記憶體必須 做好同步。goroutine奉行通過通訊來共享記憶體,而不是共享記憶體通訊

它跟map一樣,使用make來建立,它是乙個引用 ,而不是值傳遞

make(chan type, capacity)

channel <- value //傳送value到channel

<- channel  //接收並將其丟棄

x := <-channel  //從channel中接收資料,並賦值給x

x, ok := <-channel //功能同上,同時檢查通道是否已關閉或者是否為空

package main

import (

"fmt"//

"time"

)var ch = make(chan int

)func printer(s

string

) }

//person1執行完成後才能到person2執行

func person1()

func person2()

func main()

}

先看執行的結果

helloworld

如何實現的?

首先需要知道的是person1和person2的子協程幾乎是同時執行的,但是,因為person2在列印之前有乙個管道的處理,而與幾乎同時,person1已經在執行print語句了,執行完print語句後又向管道存了值

person2中的管道語句一看管道來值了,也就繼續執行了後面的print語句,這樣才實現了上面的結果

Go channel實現原始碼分析

go通道基於go的併發排程實現,本身並不複雜,go併發排程請看我的這篇文章 go併發排程原理學習 1.channel資料結構 type hchan struct type waitq struct 2.建立channel實現 建立channel例項 ch make chan int,4 實現函式 f...

go channel的學習總結

channel是goland中一種特殊的型別的存在,對於goland的學習來說是非常重要的。channel是goland中goroutine間的通訊的一種方式,可以模擬成 unix 中的程序的通訊方式管道。因為goland是乙個支援併發的程式語言,而且channel又在併發中起了關鍵作用,所以我們簡...

3種優雅的Go channel用法

寫go的人應該都聽過rob pike的這句話 do not communicate by sharing memory instead,share memory by communicating.相信很多朋友和我一樣,在實際應用中總感覺不到好處,為了用channel而用。但以我的切身體會來說,這是寫...