首页  >  文章  >  后端开发  >  Go中如何使用WaitGroups和Mutexes来实现并发goroutine之间的互斥?

Go中如何使用WaitGroups和Mutexes来实现并发goroutine之间的互斥?

Barbara Streisand
Barbara Streisand原创
2024-11-03 22:02:03356浏览

How can WaitGroups and Mutexes be used to achieve mutual exclusion between concurrent goroutines in Go?

使用 WaitGroup 和互斥体实现并发 Goroutines 的互斥

Go 中一次只有一个 Goroutine 的情况下实现并发 Goroutine 的互斥可以执行某些代码,我们可以利用 WaitGroup 和互斥体的组合。

WaitGroup 是一个同步原语,它允许我们等待一组 goroutine 完成执行后再继续。另一方面,互斥锁提供了互斥锁机制,确保代码的关键部分不会同时被多个 goroutine 执行。

考虑以下示例代码:

<code class="go">package main

import (
    "fmt"
    "rand"
    "sync"
)

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)

func Routine1() {
    mutex1.Lock()
    defer mutex1.Unlock() // Ensure mutex is always unlocked before returning
    // do something

    // Sending and printing events should be mutually exclusive
    for i := 0; i < 200; i++ {
        mutex2.Lock()
        defer mutex2.Unlock()
        mutex3.Lock()
        defer mutex3.Unlock()
        fmt.Println("value of z")
    }

    // do something
}

func Routine2() {
    mutex2.Lock()
    defer mutex2.Unlock()
    // do something

    // Sending and printing events should be mutually exclusive
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        defer mutex1.Unlock()
        mutex3.Lock()
        defer mutex3.Unlock()
        fmt.Println("value of z")
    }

    // do something
}

func Routine3() {
    mutex3.Lock()
    defer mutex3.Unlock()
    // do something

    // Sending and printing events should be mutually exclusive
    for i := 0; i < 200; i++ {
        mutex1.Lock()
        defer mutex1.Unlock()
        mutex2.Lock()
        defer mutex2.Unlock()
        fmt.Println("value of z")
    }

    // do something
}

func main() {
    wg.Add(3)
    go Routine1()
    go Routine2()
    Routine3()
    wg.Wait() // Wait for all goroutines to complete
}</code>

在此代码中,我们有三个独立的 goroutine(Routine1、Routine2 和 Routine3),它们都同时执行某些操作。然而,我们希望确保代码的某些部分(发送和打印事件)的执行不受其他 goroutine 的干扰。

我们通过利用互斥体来实现这一点。我们定义三个互斥体(互斥体 1、互斥体 2 和互斥体 3),并在执行临界区之前获取相应互斥体的锁。当一个互斥锁被一个 goroutine 锁定时,其他尝试获取同一锁的 goroutine 将被阻塞,直到该锁变得可用。

通过锁定和解锁适当的互斥锁,我们确保只有一个 goroutine 可以执行临界区在任何给定时间。这可以防止这些代码段同时执行,并保持 goroutine 之间的互斥。

最后,我们使用 WaitGroup 来确保 main 函数在所有三个 goroutine 完成执行之前不会退出。这使我们能够同步 goroutine 并控制程序的流程。

以上是Go中如何使用WaitGroups和Mutexes来实现并发goroutine之间的互斥?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn