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個核心空間執行緒執行乙個使用者空間執行緒。這種充分利用了多核系統的優勢但是上下文切換非常慢,因為每一次排程都會在使用者態和核心態之間切換。每個使用者執行緒對應多個核心...