Go lang中的同步不正确

Go lang中的同步不正确,第1张

Go lang中的同步不正确

在开始执行任何函数之前,在以下行中使用各自的类型(在中为)的零值来分配和初始化变量,

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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5476454.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-12
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存