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/

相关文章:

转到 fmt.Scanln ,它不会回显用户输入的字符。对于密码

java - 无法验证在 Go 中创建的 Java 中的 DSA 签名,反之亦然

java - DB中的并发问题

java - volatile 实际上是如何工作的?

go - 如何检查值是否为 float

Go:获取信号来源

c - 为什么这个指针解除引用的例子有效?

c - 从结构函数返回包含 int 数组的结构

c - C 中的循环在 Repl.it 中退出,但在使用 gcc 在本地运行时不退出

java - 使用 ThreadPoolExecutor 在同一线程中的 Runnable 实例之间共享数据