看了Golang后,首先感觉实在和C、C++很像。但是在并发处理等地方又做了很多的自动化工作。回想到学习C++时最重要的一步是了解C++内存模型,所以今天也特意看了一下Go语言的内存模型,希望可以进一步了解Go语言。
原文地址:https://golang.org/ref/mem
重点:
Happen-Before原理及可见性原理:
1)Go语言的编译器和处理器会对goroutine的指令进行重新排序,像jvm一样。但是前提是不改变goroutine内部行为。也就是说,其他goroutine可能会受到影响。
2)为了避免这种影响,Go语言首先定义了Happen-before和Happen-after:
Within a single goroutine, the happens-before order is the order expressed by the program.
对一个变量v,我们定义对他的读操作为R,写操作为W,那么R可以观测到W的条件是:
- R不是W的Happen-before
- 在W和R中间的时间内,变量v没有遇到其他写操作W’
对一个变量v,我们定义对他的读操作为R,写操作为W,那么R
必定会观测到W的条件是:
- W是R的Happen-before
- 其他对变量v的写操作在W之前或者R之后
单个goroutine时,以上两种情况等价。但是多个goroutine并发读取共享变量v时,我们需要构造出以上两种情况中的其中一种从而满足程序的具体需求。强制可见性必须使用第二种情况。
Synchronization:
1)程序初始化是只有一个goroutine。但是它可能创建其他goroutine
2)如果package P import了 package Q, 则Q的init方法Happen-beforeP的init方法
3)程序中创建goroutine的命令,Happen-before
这个goroutine的执行。(我的理解是,go func()命令中,先创建goroutine,然后才调用指定函数)
4)goroutine的销毁不会保证在某一个具体事件之前执行。即销毁时间是由编译器决定的