在 Go 的並發程式設計中,同步機制是確保共享資料完整性的關鍵。它提供了多種內建類型,包括:互斥鎖(Mutex):提供對共享資料的獨佔存取;讀寫鎖:允許多個goroutine 同時讀取但只能一個goroutine 寫入資料;條件變數:用於協調goroutine 間的等待與喚醒。
Go 函數並發程式設計中的同步機制
在Go 的並發程式設計中,當多個goroutine(Golang 中的輕量級執行緒)同時操作共享資料時,就需要同步機制來確保資料的完整性。 Go 提供了多種內建的同步類型,用於協調 goroutine 的存取。
1. Mutex
Mutex(互斥鎖)是一種最基本的同步機制,它提供了對共享資料的獨佔存取。一次只有一個 goroutine 可以持有 mutex,從而確保共享資料的原子操作。
import ( "fmt" "sync" ) func main() { var count int var mu sync.Mutex for i := 0; i < 1000; i++ { go func(i int) { mu.Lock() count++ mu.Unlock() }(i) } fmt.Println("Count:", count) // 输出:1000 }
2. 讀寫鎖定
讀寫鎖是一種高級的同步機制,它允許多個goroutine 同時讀取共享數據,但一次只能有一個goroutine 寫入共享資料。這可以提高並發效能,同時確保資料的完整性。
import ( "fmt" "sync" ) func main() { var count int var rw sync.RWMutex for i := 0; i < 1000; i++ { go func(i int) { rw.RLock() fmt.Println("Reading:", count) rw.RUnlock() }(i) go func(i int) { rw.Lock() count++ fmt.Println("Writing:", count) rw.Unlock() }(i) } }
3. 條件變數
條件變數(cond)用於協調 goroutine 間的等待和喚醒。當某個 goroutine 滿足特定條件時,它可以喚醒等待該條件的 goroutine。
import ( "fmt" "sync" ) func main() { var cond sync.Cond var signal bool sync.Mutex.Lock(&l) for !signal { cond.Wait(&l) } // ... 执行需要信号的代码 ... sync.Mutex.Unlock(&l) }
以上是Golang函數並發程式設計中的同步機制有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!