Go語言作為一種並發程式語言,提供了豐富的同步機制來幫助開發者處理並發問題。掌握這些同步機制對於提升並發程式設計技能至關重要。本文將透過具體的程式碼範例來說明Go語言中的一些常見同步機制,幫助讀者更能理解並運用這些機制。
互斥鎖是一種基本的同步機制,用來保護共享資源不被多個goroutine同時存取。以下是一個簡單的互斥鎖範例:
package main import ( "fmt" "sync" ) var ( counter int mutex sync.Mutex ) func incrementCounter() { mutex.Lock() defer mutex.Unlock() counter++ } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() incrementCounter() }() } wg.Wait() fmt.Println("Counter:", counter) }
在上面的範例中,透過sync.Mutex
來保護counter
變數的並發訪問,確保每次只有一個goroutine可以執行incrementCounter()
函數。
通道是Go語言中一種用於在goroutine之間進行通訊的機制,它可以用來傳遞資料和控制並發。下面是一個簡單的通道範例:
package main import "fmt" func sendData(ch chan<- int) { for i := 0; i < 5; i++ { ch <- i } close(ch) } func receiveData(ch <-chan int) { for v := range ch { fmt.Println("Received:", v) } } func main() { ch := make(chan int) go sendData(ch) receiveData(ch) }
在上面的範例中,透過通道ch
在兩個goroutine之間傳遞資料。 sendData()
函數向通道發送數據,receiveData()
函數從通道接收數據,透過range
來遍歷通道中的資料。
條件變數是一種在goroutine之間等待或發訊號的機制,常用於實作一些複雜的同步邏輯。下面是一個簡單的條件變數範例:
package main import ( "fmt" "sync" ) var ( done bool cond *sync.Cond mutex sync.Mutex ) func worker1() { mutex.Lock() for !done { cond.Wait() } mutex.Unlock() fmt.Println("Worker 1: Done") } func worker2() { mutex.Lock() done = true cond.Signal() mutex.Unlock() fmt.Println("Worker 2: Signaled") } func main() { cond = sync.NewCond(&mutex) go worker1() go worker2() }
在上面的範例中,透過條件變數cond
和互斥鎖mutex
來實作兩個goroutine之間的同步。 worker1()
函數等待done
變數為true
時才繼續執行,worker2()
函數設定done
變數為true
並發送訊號給worker1()
。
透過上述範例,希望讀者能更深入地理解Go語言中的同步機制,並在實際專案中靈活運用,提升並發程式設計技能。
以上是掌握Go語言同步機制:提升並發程式設計技能的詳細內容。更多資訊請關注PHP中文網其他相關文章!