ttys3 / utterances-cmt

this repo holds comments for utterances
0 stars 0 forks source link

post/confusing-golang-compiler-optimization/ #14

Open utterances-bot opened 2 years ago

utterances-bot commented 2 years ago

Golang编译器优化迷之操作 :: /dev/ttyS3 — 回首向来萧瑟处 也无荒野也无灯

简单的代码, 问题不简单 今天有人发了段代码给我, 然后问输出结果是什么? 这段代码看上去非常简单, 但是确是很有迷惑性. // a.go package main import ( "fmt" "time" ) var x int64 = 0

https://ttys3.dev/post/confusing-golang-compiler-optimization/

lilydjwg commented 2 years ago

这个结果对于我来说是很显然的。在 C/C++ 中 ,无副作用的死循环直接是未定义呢。跨线程访问变量一定要用原子变量或者加锁,否则很有可能看不到别的线程的修改。

ttys3 commented 2 years ago

@lilydjwg 我希望讨论是更加理性的, 少带一点秀的色彩.

  1. 本文不是讨论C/C++
  2. 对一个全局变量进行了更改, 这显示已经有副作用了.
  3. 本文评论的重点跟"跨线程访问"没有任何关系. 问题的产生也跟跨线程访问没有任何关系.
lilydjwg commented 2 years ago

这个优化一点也不迷,尤其是相比于一些更神奇的操作,比如一大堆代码因为ub没了,比如既真又假。

lilydjwg commented 2 years ago

另外这种观察不到另一个线程对全局变量的修改,也不一定要编译器优化来触发。在多核处理器或者多处理器中也可能发生:你以为你修改了内存,实际上你只修改了cpu的缓存。

ttys3 commented 2 years ago

争论没有意义.

我不希望浪费太多时间. 处理器优化是一个方面, 这就是为什么我们需要atomic. 另外, 本文讨论的并不是这个.