使用WaitGroup 實現並發Goroutine 的互斥
在你的程式碼中,你有3 個並發Goroutine,它們需要在不互互互互互互無互幹擾的情況下執行他們程式碼的特定部分。這個概念稱為互斥,它確保一次只有一個 goroutine 可以執行程式碼的關鍵部分。
要使用WaitGroup 實現互斥,可以按照以下步驟操作:
以下是實現上述步驟的範例:
<code class="go">package main import ( "fmt" "sync" ) var ( mutex1 sync.Mutex mutex2 sync.Mutex mutex3 sync.Mutex wg sync.WaitGroup ) func Routine1() { mutex1.Lock() defer mutex1.Unlock() // Do something for i := 0; i < 200; i++ { mutex2.Lock() mutex3.Lock() fmt.Println("value of z") mutex2.Unlock() mutex3.Unlock() } // Do something } func Routine2() { mutex2.Lock() defer mutex2.Unlock() // Do something for i := 0; i < 200; i++ { mutex1.Lock() mutex3.Lock() fmt.Println("value of z") mutex1.Unlock() mutex3.Unlock() } // Do something } func Routine3() { mutex3.Lock() defer mutex3.Unlock() // Do something for i := 0; i < 200; i++ { mutex1.Lock() mutex2.Lock() fmt.Println("value of z") mutex1.Unlock() mutex2.Unlock() } // Do something } func main() { wg.Add(3) go Routine1() go Routine2() go Routine3() wg.Wait() }</code>
在此範例中,每個goroutine 的關鍵部分是執行fmt.Println("value of z")的循環。互斥體確保一次只有一個 goroutine 可以執行此部分。 WaitGroup 確保主 goroutine 在退出之前等待所有 goroutine 完成。
以上是如何使用 WaitGroup 在並發 goroutine 中實現互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!