登录
首页 >  Golang >  Go问答

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

来源:stackoverflow

时间:2024-03-30 17:18:29 345浏览 收藏

小伙伴们对Golang编程感兴趣吗?是否正在学习相关知识点?如果是,那么本文《我应该用互斥体保护结构对象吗?》,就很适合你,本篇文章讲解的知识点主要包括。在之后的文章中也会多多分享相关知识点,希望对大家的知识积累有所帮助!

问题内容

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

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

我不确定这 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
}

解决方案


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

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

今天关于《我应该用互斥体保护结构对象吗?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>