猿问

我应该用互斥量保护结构对象吗?

我使用 4 个 go 例程来分配结构实例的不同成员变量。每个成员变量只能由一个 go routine 访问。


访问struct实例时是否需要加mutex?


我不确定这 4 个 go 例程是否访问相同的内存。我觉得我应该是因为他们所有人都可以访问持有人。


这段代码演示了我在做什么。


package main


import (

    "fmt"

    "sync"

)


func main() {

    var wg sync.WaitGroup

    var res Response


    var mu sync.Mutex


    wg.Add(1)

    go func() {


        defer wg.Done()

        mu.Lock()

        defer mu.Unlock()

        res.A = []string{"a"}

    }()


    wg.Add(1)

    go func() {

        defer wg.Done()

        mu.Lock()

        defer mu.Unlock()

        res.B = "b"

    }()


    wg.Add(1)

    go func() {

        defer wg.Done()

        mu.Lock()

        defer mu.Unlock()

        res.C = 100

    }()


    wg.Add(1)

    go func() {

        defer wg.Done()

        mu.Lock()

        defer mu.Unlock()

        res.D = map[string]string{

            "d": "dd",

        }

    }()


    wg.Wait()


    fmt.Println(res)


}


type Response struct {

    A []string

    B string

    C int

    D map[string]string

}


慕妹3242003
浏览 93回答 1
1回答

翻过高山走不出你

您不需要此程序的互斥量。就 Go 内存模型而言,结构的单独字段是单独的变量。由于四个 goroutine 正在访问四个独立的(子)变量,因此即使没有互斥量,也不存在数据竞争。
随时随地看视频慕课网APP

相关分类

Go
我要回答