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

时间:2019-05-24 21:53:25

标签: go

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

访问结构实例时是否需要添加互斥锁?

我不确定4个例程是否访问相同的内存。我认为我应该让他们所有人都访问持有人。

此代码演示了我在做什么。

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
}

1 个答案:

答案 0 :(得分:2)

此程序不需要互斥体。就Go内存模型而言,结构的单独字段是单独的变量。由于四个goroutine正在访问四个单独的(子)变量,因此即使没有互斥锁也不会发生数据争用。

您可以通过删除互斥锁并在启用了种族检测器的情况下运行程序来验证这一点:https://golang.org/doc/articles/race_detector.html