dictionary - 在同步 map 中检测到数据争用情况-Golang

标签 dictionary go race-condition

我使用-race go工具参数运行测试,输出

--- FAIL: TestRaceCondition (0.00s)
    testing.go:853: race detected during execution of test
func TestRaceCondition(t *testing.T) {
    var map sync.Map
    for i := 0; i < 10; i++ {
        go func() {
            map.Store(strconv.Itoa(i), nil)
        }()
    }
}

我不明白,因为根据doc

映射可以安全地由多个goroutine并发使用,而无需
附加锁定或协调。

最佳答案

比赛在i上。通过将值传递给函数而不是引用单个局部变量来进行修复:

func TestRaceCondition(t *testing.T) {
    var map sync.Map
    for i := 0; i < 10; i++ {
        go func(i int) {
            map.Store(strconv.Itoa(i), nil)
        }(i)
    }
}

另一个选择是在循环内声明另一个变量i:
func TestRaceCondition(t *testing.T) {
    var map sync.Map
    for i := 0; i < 10; i++ {
        i := i  // each goroutine sees a unique i variable.
        go func() {
            map.Store(strconv.Itoa(i), nil)
        }()
    }
}

关于dictionary - 在同步 map 中检测到数据争用情况-Golang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59290446/

相关文章:

c++ - 使用值对 std::map 进行排序

go - fmt软件包中的不同打印功能之间有什么区别?

go - 如何使用 HTML 和 CSS 设置 Go 错误的样式?

linux - 访问wait_event_timeout Linux接口(interface)中的共享变量

javascript - Ajax 调用的 Angular 1 服务的竞争条件

python - 您如何为用户定义的对象定义类似字典的赋值?

java - 如何在Java map.entry值上调用用户定义的函数?

python - 从python字典中删除重复的键但连接重复键的值

go - 如何使用 Viper 访问 `StringToStringVar` 类型的 Cobra Flag?

c - 为什么 pthread 条件变量不起作用