小编lty*_*lty的帖子

go编译器可以重新排序以下代码吗?

最近,我发现一些代码如下所示:

var m map[int]int

func writem() {
    tmpm := make(map[int]int)
    for i := 0; i < 4000000; i++ {
        tmpm[i] = i + 10
    }
    m = tmpm
}

func readm() {
    for k, v := range m {
        _, _ = k, v
    }
}

func main() {
    writem()
    go readm()
    writem()
}
Run Code Online (Sandbox Code Playgroud)

该程序运行良好,但是我认为writem可以通过m = tmpm在for循环之前移动功能主体来重新排序,因为这不会更改此goroutine中的行为。而且这种重新排序将导致concurrent map read and map write问题。正如Go Memory Model所说:

仅当重新排序不会改变语言规范所定义的该goroutine中的行为时,编译器和处理器才可以对单个goroutine中执行的读写进行重新排序。

是的,还是这样编写代码安全吗?

concurrency go happens-before data-race

-1
推荐指数
1
解决办法
72
查看次数

标签 统计

concurrency ×1

data-race ×1

go ×1

happens-before ×1