首页 > 后端开发 > Golang > 正文

如何使用 WaitGroup 在并发 goroutine 中实现互斥?

Linda Hamilton
发布: 2024-11-01 13:57:02
原创
207 人浏览过

How can I achieve mutual exclusion in concurrent goroutines using WaitGroup?

使用 WaitGroup 实现并发 Goroutine 的互斥

在你的代码中,你有 3 个并发 Goroutine,它们需要在互不干扰的情况下执行他们代码的特定部分。这个概念称为互斥,它确保一次只有一个 goroutine 可以执行代码的关键部分。

要使用 WaitGroup 实现互斥,可以按照以下步骤操作:

  1. 为每个并发 Goroutine 创建一个互斥体:互斥体是一种锁定机制,只允许一个 Goroutine 在某一时刻获取锁。 时间。为每个需要独占执行其临界区的 goroutine 创建一个单独的互斥体。
  2. 进入临界区之前获取互斥体:在每个 goroutine 中执行临界区代码之前,调用相应互斥锁上的 Lock() 方法。此操作将阻塞 goroutine,直到获取互斥锁。
  3. 离开临界区后释放互斥锁:完成临界区执行后,通过调用 Unlock() 释放互斥锁方法。这允许其他 goroutine 获取互斥体并进入其临界区。
  4. 使用 WaitGroup 等待完成: 创建一个 WaitGroup 来跟踪所有 goroutine 的完成情况。每个goroutine在完成执行后应该调用WaitGroup的Done()方法。主协程应该使用 WaitGroup 的 Wait() 方法等待所有协程完成。

下面是一个实现上述步骤的示例:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!