如何理解go语言的内存模型?

dexter-qjq · · 2115 次点击
这个问题明明文档一开始就写了啊?go的内存模型就是这样的啊,文档例子里就有作者提的代码。[The Go Memory Model](https://golang.org/ref/mem) 中说了 `Within a single goroutine, reads and writes must behave as if they executed in the order specified by the program. That is, compilers and processors may reorder the reads and writes executed within a single goroutine only when the reordering does not change the behavior within that goroutine as defined by the language specification. Because of this reordering, the execution order observed by one goroutine may differ from the order perceived by another. For example, if one goroutine executes a = 1; b = 2;, another might observe the updated value of b before the updated value of a.` 大概意思就是 `不改变语言规范定义的行为时,编译器和处理器才可以重新排序在单个goroutine中执行的读取和写入。由于这种重新排序,一个goroutine观察到的执行顺序可能与另一个goroutine所感知的顺序不同。例如,如果一个goroutine执行a = 1; b = 2;,另一个可能会在a的更新值之前观察到b的更新值。` 也就是说对于题主的例子: ``` a = "hello, world" done = true ``` 在main goroutine看来a和done的顺序是不确定的,如果编译器和cpu进行了重排,就有可能done比a先执行的。
#23
更多评论
好像不关内存什么事吧,是你基础没有学好 首先 done 的初始化应该为 false 就是 0,一般情况下 所有的语言 bool 类型 初始化都为 false 然后 for 循环,!done ,差不多相当于 只要是 done 为false 就会一直循环下去,直到 done 变为 true。 也就是 不关 你的 setup 什么时候执行,一旦执行后,done 变为 true,for 循环结束跳出,之后 print
#1
你上面那个说明在哪里看到的?这里难道不是应该注意读写并发么
#2