使用 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中文网其他相关文章!