golang 協程通訊總結

2021-10-01 06:01:54 字數 2508 閱讀 3236

select 配合 case default 使用, case 條件必須是乙個 chan

```

chan1 := make(chan int)

t := time.ticker(time.second * 3)

select

t.stop()

```

共享資源 通過加鎖的方式 實現共享記憶體通訊模型
我們所說的同步其實就是在控制多個執行緒對共享資源的訪問:

乙個執行緒在想要訪問某乙個共享資源的時候,需要先申請對該資源的訪問許可權,

並且只有在申請成功之後,訪問才能真正開始;而當執行緒對共享資源的訪問結束時,

它還必須歸還對該資源的訪問許可權,若要再次訪問仍需申請.

一但某個資源被確定為共享資源,則 不管是在子執行緒 或是 主線程,訪問共享資源,一定要加鎖,訪問結束後 一定要解鎖,

不然很容易引起資源競爭

sync.cond 共享資源狀態發生變化時 通知其它因此而阻塞的執行緒

原子操作

原子操作通常是 cpu 和 作業系統提供支援的,由於執行過程中不會中斷,所以可以完全消除競態條件,從而絕對保證

併發安全性,此外,由於不會中斷,所以原子操作本身要求也很高,既要簡單,又要快速。go語言的原子操作也是基於cpu和

作業系統的,由於簡單和快速的要求,只針對少數資料型別的值提供了原子操作函式,這些函式都位於標準庫**包sync/atomic中。

這些原子操作包括加法(add)、比較並交換(compare and swap ,簡稱cas)、載入(load)、 儲存(store) 和 交換 (swap)

func addint32(addr *int32, delta int32) (new int32)

func addint64(addr *int64, delta int64) (new int64)

func adduint32(addr *uint32, delta uint32) (new uint32)

func adduint64(addr *uint64, delta uint64)(new uint64)

func adduintptr(addr *uintptr, delta uintptr) (new uintptr)

前兩個函式 可以傳遞負數實現 減法操作

比較並交換

func loadint32(addr *int32) (val int32)

func loadint64(addr *int64) (val int64)

func loadpointer(addr *unsafe.pointer) (val unsafe.ponter)

func loaduint32(addr *uint32) (val uint32)

func loaduint64(addr *uint64) (val uint64)

func loaduintptr(addr *uintptr) (val uintptr)

儲存

func storeint32(addr *int32, val int32)

func storeint64(addr *int64, val int64)

func storepointer(addr *unsafe.pointer, val unsafe.pointer)

func storeuint32(addr *uint32, val uint32)

func storeuint64(addr *uint64, val uint64)

func storeuintptr(addr *uintptr, val uintptr)

交換

原子型別 atomic.value 只有兩個方法 store(value) load()

type value struct 

}var v atomic.value

v.store(100)

fmt.println("v:", v.load())

儲存值不能是 nil;其次,我們向原子型別儲存的第乙個值,

決定了它今後能且只能儲存該型別的值。如果違背這兩條,編譯時會丟擲 panic

sync.waitgroup 開箱即用,併發安全

sync.once 型別

通過 context 包提供的函式實現多協程之間的協作

func addnum(a *int32, b int, deferfunc func())()

for i := 0; ; i++ else

} }

func main()})}

<- ctx.done()

fmt.println("done")

}

希望本文章對你有用

Golang協程排程

有時候可能會出現這種情況,乙個無恥的goroutine阻止其他goroutine執行。當你有乙個不讓排程器執行的 for迴圈時,這就會發生。package main import fmt func main for done fmt.println done for迴圈並不需要是空的。只要它包含了不...

golang 協程理解

本文總結一下go協程的理解,如有錯誤望請指正。網上都說協程是一種輕量級執行緒,執行緒又是一種輕量級的程序。這話在語言層面看來是沒有錯的,但它們的實現是不同的。執行緒是cpu資源排程的最小單位。協程不由cpu進行排程,由應用程式進行排程,也就是由go進行排程。在go中,協程的排程也有專門的排程器。但g...

Golang 協程排程

n個使用者空間執行緒在1個核心空間執行緒上執行。優勢是上下文切換非常快但是無法利用多核系統的優點,多個使用者空間執行緒無法並行執行。1個核心空間執行緒執行乙個使用者空間執行緒。這種充分利用了多核系統的優勢但是上下文切換非常慢,因為每一次排程都會在使用者態和核心態之間切換。每個使用者執行緒對應多個核心...