栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Go lang中的同步不正确

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/484314.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号