go - 即使使用互斥锁,打印结构字段时也会出现竞争条件

标签 go struct concurrency mutex race-condition

为什么 mutex.Lock() 在下面的代码中不起作用?每次我进行比赛测试时,它都会显示有比赛。

我尝试在子结构中使用锁,然后在父结构中使用锁来锁定状态,但它们都不起作用。 竞争测试一直说存在竞争条件。

我已经尝试过 t.Lock()t.data.Lock()

type Test struct {
    name string
    data Data
    sync.RWMutex //Should I put it here?
}

type Data struct {
    d map[string]int
    sync.RWMutex // Should I put it here?
}

func (t *Test) add(key string) {
    t.data.Lock()
    defer t.data.Unlock()
    t.data.d[key] += 1
}

func (t *Test) read() {
    for {
        t.data.Lock()
        _= t.data.d["test"]
        t.data.Unlock()
    }
}

func main() {
    t := &Test{}
    t.name = "oops"
    t.data = Data{}
    t.data.d = make(map[string]int)
    t.data.d["test"] = 1

    for i := 0; i <= 10; i++ {
        go func(t *Test) {
            t.add("test")
        }(t)
        go func(t *Test) {
            t.read()
        }(t)
    }
    time.Sleep(time.Second * 3)
    fmt.Printf("result is %v", t.data.d["test"])

最佳答案

The race test keeps saying there is race condition.


声明

fmt.Printf("result is %v", t.data.d["test"])

传递参数

t.data.d["test"]

按值(value)。它通过分配创建一个副本,即读取。

您需要通过互斥体保护读取。

t.data.Lock()
fmt.Printf("result is %v\n", t.data.d["test"])
t.data.Unlock()

关于go - 即使使用互斥锁,打印结构字段时也会出现竞争条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56646440/

相关文章:

c - 在另一个结构中重新分配结构数组

c - 带指针的结构

multithreading - 与线程相比,Actor 的工作原理如何?

java - 以 block 的形式读取 ConcurrentHashMap (或类似的)

http - http.HandleFunc始终匹配“/”

html - 如何保留HTTP主体的gzip表示形式

c# - 什么时候结构太大了?

java - 当方法同步时,我们可以使用 StringBuilder 而不是 StringBuffer 吗?

go - 由于垃圾收集,指针会改变 Go 中的值吗?

go - 尝试在 Go 中测试一个空的自引用结构值