Go程式語言讀書筆記 第八章

2021-09-19 03:21:16 字數 2433 閱讀 6117

第八章-goroutine和通道

goroutine:在go裡,每乙個併發執行的活動成為goroutine。語法上,乙個go語句實在普通的函式或者方法呼叫前加上go關鍵字。

go f() //新建乙個f()的goroutine,不用等待
通道:如果說goroutine是go程式併發的執行體,通道就是他們之間的連線。通道是可以讓乙個叫goroutine傳送特定值到另乙個goroutine的通訊機制。每乙個通道是乙個具體型別的導管,叫做通道的元素型別。乙個有int型別元素的通道寫為chan int。

使用make函式來建立乙個通道:

ch := make(chan int)   // ch的型別是 『chan int』
像map一樣,通道是乙個使用make建立的資料結構的引用。當複製或者作為引數傳遞到乙個函式事,複製的是引用,這樣呼叫者和被呼叫者都引用同乙份資料結構。和其他引用型別一樣,通道的零值是nil。

同種型別的通道可以使用==進行比較。當二者都是同一通道資料的引用時,比較值為true。通道也可以和nil進行比較。

通道主要有兩個操作:傳送和接收,兩者稱為通訊

ch <- x  //傳送語句

x = <-ch //賦值語句中的接收表示式

<-ch //接收語句,丟棄結果

通道支援第三個操作:關閉,他設定乙個標誌位來指示值當前已經傳送完畢,這個通道後面沒有值了;關閉後的傳送操作將導致宕機。

在乙個已經關閉的通道上進行接收,將獲取所有已經傳送的值,直到通道為空;這時任何接收操作會立刻完成,同時獲取到乙個通道元素型別對應的零值。

close(ch)
無緩衝通道:

無緩衝通道上的傳送操作將會阻塞,知道另乙個goroutine在對應的通道上執行接收操作,這是值傳送完成,兩goroutine都可以繼續執行。相反,如果接受操作先執行,接收方goroutine將阻塞,直到另乙個goroutine在同乙個通道上傳送乙個值。

使用無緩衝通道進行的通訊導致傳送和接收goroutine同步化。當乙個值在無緩衝通道上傳遞時,接收值後傳送方goroutine才能再次被喚醒。

func main() 

done := make(chan struct{})

go func() {} // signal the main goroutine

}()mustcopy(conn, os.stdin)

conn.close()

<-done // wait for background goroutine to finish

}

每乙個訊息有乙個值,但有時候通訊本身以及通訊發生的時間也很重要。當我們強調這方面的時候,把訊息叫做事件。當事件沒有攜帶額外的資訊時,它單純的目的使進行同步。

管道:通道可以用來連線goroutine,這樣乙個得輸出是另乙個得輸入。

func main() 

close(naturals)

}()// squarer

go func()

close(squares)

}()// printer (in main goroutine)

for x := range squares

}

var tokens = make(chan struct{}, 20)

func crawl(url string) string {} // acquire a token

list, err := links.extract(url)

<-tokens // release the token

if err != nil

return list

}

在執行之前呼叫tokens <- struct{}{}獲取乙個名額,執行結束後呼叫<-tokens釋放名額。

select多路復用:像switch語句一樣,有一系列的情況和乙個可選的預設分支。每乙個情況指定一次通訊(在一些通道上進行傳送或接收操作)和關聯的一段**。

接收操作可以出現在它本身上,也可以用引用所接受的值。

select一直等待,直到一次通訊來告知有一些情況可以執行,它執行這次通訊,其他的通訊將不會發生。沒有對應情況的select,將永遠等待。

func main() 

}}

上面,如果多個情況同時滿足,select隨機選擇乙個,因為當緩衝區既不空也不滿的情況,select相當於在擲硬幣選擇。

select
非阻塞通訊。通道的零值是nil。在nil通道上傳送和接收將永遠阻塞,對於select語句中的情況,如果其通道是nil,他將永遠不會被選擇。稱為通道的輪詢。對於select,如果其通道是nil,他將永遠不會被選擇。

第八章讀書筆記

本章主要講了蜂鳴器的實驗原理,通過完整的蜂鳴器驅動控制蜂鳴器的開啟與關閉。蜂鳴器是s3c410開發板上帶的乙個硬體裝置。可以通過向暫存器寫入特定的值來控制蜂鳴器發出尖叫聲。蜂鳴器也稱為pwm脈衝寬度調製,基本原理就是通過脈衝來控制蜂鳴器的開啟和停止。pwm驅動的實現方式不同於led驅動,pwm驅動由...

第八章 讀書筆記

第八章 讓開發板發出聲音 蜂鳴器驅動 一.linux驅動的 重用。linux驅動的 重用有很多種方法。可以採用標準的c程式的方式,將要重用的 放在其他的檔案中。也可以使用另外一種動態重用的方式,也就是喲個linux驅動可以使用另外乙個linux驅動中的資源。二.強行解除安裝linux驅動。如果編寫的...

第八章讀書筆記

第8 章 重用 1,靜態重用 將要重用的 放在其他的檔案中,如果要使用某些功能,include 相應的標頭檔案即可 2,動態重用 乙個 linux 驅動可以使用另外乙個 linux 驅動中的資源 解除安裝由於異常情況而導致的linux 驅動模組無法解除安裝的情況 1.初始化函式崩潰 將當前的linu...