在开始执行任何函数之前,在以下行中使用各自的类型(在中为)的零值来分配和初始化变量,
a并在此行:
b``0``int
var a, b int
可能更改的是在
f()函数中将新值分配给它们的顺序。
从该页面引用:之前发生:
在单个goroutine中,读取和写入的行为必须像它们按照程序指定的顺序执行一样。也就是说,仅当重新排序不会改变语言规范所定义的该goroutine中的行为时,编译器和处理器才可以对单个goroutine中执行的读取和写入进行重新排序。由于此重新排序,一个goroutine观察到的执行顺序可能与另一个goroutine察觉到的执行顺序不同。例如,如果执行一个goroutine,则另一个goroutine
a = 1; b = 2;可能会在的更新值b之前观察到的更新值a。
如果对它们进行重新排序不会对同一goroutine
产生影响
a,则
b可以按照您编写它们的顺序进行分配,并且可能不会发生。例如,如果首先更改的值
b更有效(例如,因为其地址已加载到寄存器中),则编译器可能会对其重新排序。如果更改分配顺序会(或可能)在同一goroutine中引起问题,则显然编译器不允许更改顺序。由于
f()函数的goroutine对变量不执行任何 *** 作,
a并且
b在赋值之后,编译器可以自由地以任何顺序执行赋值。
由于在上面的示例中这两个goroutine之间没有同步,因此编译器不费力气检查重新排序是否会在另一个goroutine中引起任何问题。不必。
另外,如果您对goroutine进行同步,则编译器将确保在“同步点”不会出现任何不一致之处:您将确保在这时两个分配都将“完成”;因此,如果“同步点”在
print()调用之前,那么您将看到打印的已分配新值:
2和
1。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)