併發程式設計這塊斷斷續續看了挺久的,&感覺還是有地方沒有理解。有時間還是要找找正式的**看一看,不然不知道怎麼用啊。
有些地方不清楚該怎麼用,所以下面寫的有些亂,再有新的理解再進行補充。。。
// gostudy0228 project main.go/*go語言學習——併發程式設計
go語言中支援輕量級執行緒goroutine
go語言中以訊息機制作為通訊方式
*/package main
import (
"fmt"
"sync"
"time"
)func main() //定義陣列
var v3 chan bool = make(chan bool, 10) //另一種定義chan的方式,後面的10,是快取空間的大小,快取區在被填滿的時候是阻塞的
go add(v1, v3) //go關鍵字啟動goroutine
v1 <- v2 //將v2傳入chan,在goroutine沒有建立的時候,不能向v1傳值。
var v4 bool = <-v3 //這裡進行阻塞,直到add函式向chan中傳入值以後才能夠繼續執行。不然可能goroutine沒有執行完,main就已經執行完了。
fmt.println(v4) //可以將add函式的isfinished去掉,然後執行看結果,就知道為什麼要額外加乙個chan了
v6 := make(chan int, 10)
timeout := make(chan bool)
go timewait(timeout) //一種超時處理方式,但目前沒有理解號怎麼用
select
//------------------------------
//單向chan的建立
//v21 := make(chan int, 1024) //基於v21建立單向chan
//v22 := <-chan int(v21) //唯讀
//v23 := chan<- int(v21) //只寫
close(v1) //關閉管道v1
_, ok1 := <-v1
fmt.println("v1 is open?", ok1)
//------------------------------
//同步鎖
//var v31 sync.mutex int//單一讀寫
//var v32 sync.rwmutex float32//單寫多讀
鎖定和解鎖要對應,否則死鎖卡死
//defer v31.unlock()//這個函式崩潰的時候執行這句,解除鎖定
//defer v32.runlock()
//------------------------------
var v41 sync.once //全域性唯一,多個呼叫的時候,會阻塞,乙個執行完才進行下乙個
v41.do(func() )
} //程式執行到這退出
func add(ch chan [2]int, isfinished chan bool)
isfinished <- true
}func timewait(isfinished chan bool)
/*幾種多執行緒的方式
1.多程序,作業系統層面,開銷大
2.多執行緒,系統層面,使用最多,最有效,開銷較大,高併發對效能有影響
3.基於回掉的非阻塞/非同步io,通過事件驅動方式使用非同步io,盡可能少用執行緒,降低開銷,但程式設計比多執行緒要複雜
4.協程,有效解決高併發問題,系統開銷極小,程式設計簡單,結構清晰,但是需要語言支援(或者使用者自行拓展)
*//*
執行緒間通訊:共享記憶體模式,訊息傳遞模式
*/
GO語言學習 併發
goroutine 由go執行環境管理的輕量級執行緒 channel 有型別的管道,操作符為 資料流向箭頭指向的方向 使用make chan 緩衝資料型別 緩衝區長度 來建立 使用close chan 來關閉管道,只有傳送者才允許關閉管道 例ch make chan int 10 ch 10 a c...
GO語言學習 併發
通道channel 併發 concurrency 邏輯上具備同時處理多個任務的能力。並行 parallesim 不同於併發,物理上的同一時刻,相當於併發設計的理想執行模式。在函式呼叫前新增go關鍵字即可建立併發任務 a 100go func x,y int a,counter a a 66print...
go語言學習筆記22 Go語言併發程式設計
goroutine是go語言並行設計的核心,有人稱之為go程。goroutine說到底其實就是協程,它比執行緒更小,十幾個goroutine可能體現在底層就是五六個執行緒,go語言內部幫你實現了這些goroutine之間的記憶體共享。執行goroutine只需極少的棧記憶體 大概是4 5kb 當然會...