代码之家  ›  专栏  ›  技术社区  ›  Rodion Gorkovenko

在Golang中,是什么确保对Mutex方法的调用不会相对于其他语句重新排序?

  •  -1
  • Rodion Gorkovenko  · 技术社区  · 3 年前

    正如我在阅读中所理解的 Go Memory Model 文章中,编译器被允许对语句进行重新排序,尽管这种能力受到某些限制。

    然而,我不明白是什么限制了语句的重新排序,其中包括 Mutex 锁定和解锁,即:

    mu.RLock()
    d := primes[i]
    mu.RUnlock()
    

    是什么确保第二行不会被重新排序到顶部?是关于这个短语吗

    不引入数据竞赛也意味着不假设被调用的函数总是返回或没有同步操作。

    即仅仅依赖于这样一个事实 Lock() 是函数调用(我想,不是以某种方式内联的),还是有不同的机制/逻辑?

    0 回复  |  直到 3 年前
        1
  •  2
  •   zigbee    3 年前

    块中的语句按源代码顺序执行(忽略依赖项控制顺序的包块的特殊情况)。优化必须保留此执行顺序的副作用。

    该规范没有具体说明块中的语句是按源代码顺序执行的。也许作者认为这是显而易见的,不需要说出来。

    如果编译器不能证明 i , primes 或的支持 素数 仅对当前goroutine可见,则编译器无法在不更改语句副作用的情况下对语句进行重新排序。