范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Golang内存模型

  简介
  Golang  内存模型指定了一种条件,在这种条件下,一个goroutine  中变量的读取可以保证观察到不同goroutine  中相同变量的写入所产生的值。官方文档建议修改由多个 goroutine  同时访问的数据的程序必须序列化这种访问。要序列化访问,请使用 channel  操作或其他同步原语(sync  和sync/atomic  )保护数据。如果您必须阅读本文档的其余部分才能理解程序的行为,那么您太聪明了。 别自作聪明。 happens before
  在一个 goroutine  中,读写操作必须按照程序指定的顺序执行。也就是说,只有当重新排序不会改变语言规范定义的某个goroutine  中的行为时,编译器和处理器才可以对单个goroutine  中执行的读写指令进行重新排序。由于存在重新排序,一个goroutine  观察到的执行顺序可能与另一个goroutine  观察到的执行顺序不同。例如,如果一个goroutine  执行a=1;b=2;  ,另一个可能会在a  的更新值之前观察到b  的更新值。
  为了确定读写的需求, Golang  定义了程序中执行内存操作的偏序:如果事件e1  发生在事件e2  之前,那么我们说e2  发生在事件e1  之后,同样,如果e1  不发生在e2  之前,也不发生在e2  之后,那么我们说e1  和e2  同时发生。
  在一个 goroutine  内,happens-before  顺序就是程序编写的顺序。如果以下两种情况均成立,则允许变量  v  的读取r  观察到对v   的写入 w  :r does not happen before w.
  There is no other write w to v that happens after w but before r.为了保证变量  v   的读 r   观察到特定的写 w  ,确保 w   是唯一被允许观察的写。也就是说,如果以下两个条件均成立,则 r   保证观察到 w   :w happens before r.
  Any other write to the shared variable v either happens before w or after r.
  这一对条件比第一对条件强;它要求没有其他写操作与  w   或 r   同时发生。
  在单个 goroutine  中,没有并发性,因此这两个定义是等效的:read r   观察由最近的write w   写入 v   的值。
  当多个 goroutine  访问共享变量 v   时,它们必须使用同步事件来建立在确保读取观察所需写入之前发生的条件。
  变量的初始化在内存模型中被认为是write。
  大于一个机器字的值的读写行为与多个单机器字大小的操作一样,无顺序。 同步初始化
  程序的初始化在一个特定的 goroutine  中完成,但是该协程可以创建其他协程并发运行。
  如果包 p  引入了包q  ,则包q  的init  的函数执行完成happens before  包p  的init  函数开始执行。
  main.main  函数的执行happens after  所有init  函数的执行完成。协程创建
  开始新 goroutine  的go  语句发生在goroutine  执行开始之前。var a string  func f() {     print(a) }  func hello() {     a = "hello, world"     go f() }
  上面的代码输出 hello world  . 因为a  的写(第8行)happen before   协程创建(第9行),所以a  的写happen before  协程的执行。协程销毁
  goroutine  的退出不能保证发生在程序中的任何事件之前。var a string  func hello() {     go func() { a = "hello" }()     print(a) }
  上面的代码并不能保证一定输出 hello  。因为分配给a  之后没有任何同步事件,因此不能保证任何其他goroutine  都能观察到它。一个激进的编译器可能会删除整个go  语句。
  如果一个 goroutine  的效果必须由另一个goroutine  观察,则应该使用同步机制(如锁或通道通信)来建立相对顺序。通道(channel)通信
  通道通信是 goroutine  之间同步的主要方法。特定通道上的每个发送都与该通道的相应接收相匹配。
  有缓冲通道上的发送发生在该通道相应的接收完成之前。 var c = make(chan int, 10) var a string  func f() {     a = "hello, world"     c <- 0 }  func main() {     go f()     <-c     print(a) }
  上面程序能够保证输出 hello world  ,因为a  的写操作发生在通道写之前,通道写发生在读之前。
  通道关闭发生在因为通道已关闭返回零值的接收之前。 var c = make(chan int, 10) var a string  func f() {     a = "hello, world"     close(c) }  func main() {     go f()     <-c     print(a) }
  这个代码和上面代码有相同的效果。
  从无缓冲通道的接收发生在该通道上的发送完成之前。 var c = make(chan int) var a string  func f() {     a = "hello, world"     <-c }  func main() {     go f()     c <- 0     print(a) }
  上述代码可以打印 hello, world  , 对a  的写入发生在c  上的接收之前,发生在c  上相应的发送完成之前,发生在打印之前。var c = make(chan int, 1) var a string  func f() {     a = "hello, world"     <-c }  func main() {     go f()     c <- 0     print(a) }
  上述代码不能保证输出 hello world  ,可能会造成程序崩溃或者打印空字符串。
  容量为 C  的通道上的第k  次接收发生在该通道的第k+C  次发送完成之前。
  此规则将上一个规则推广到缓冲通道。它允许通过缓冲通道对计数信号量进行建模:通道中的元素数量对应于活动使用的数量,通道容量对应于同时使用的最大数量,发送元素获取信号量,接收元素释放信号量。这是限制并发的常用习惯用法。 var limit = make(chan int, 3)  func main() {     for _, w := range work {         go func(w func()) {             limit <- 1             w()             <-limit         }(w)     }     select{} }
  上面代码用有 buffer  的管道限制同时工作的协程的最大数量。锁
  sync  包实现了sync.Mutex   和sync.RWMutex  两种锁
  任给 sync.Mutex  或sync.RWMutex  的实例l  和n
历年最应得到金球奖的球员这些年的金球奖争议不断,网上传言梅西偷走了几个金球。按照网上的舆论,盘点一下这些年来最应该得到金球奖的球员。2010年伊涅斯塔世界杯年,世界杯占70,伊涅斯塔在决赛打入绝杀。不过颁现役功成名就的五大角色球员,伊戈达拉名利双收,格林缔造传奇NBA作为顶级篮球殿堂,从来不缺少传奇。在超级巨星主宰比赛的小球时代,依然有着角色球员逆天改命,书写伟大的传奇故事。今天,盘点现役功成名就的五大角色球员。第五名低顺位传奇麦考麦考2阿森纳19轮50分排名历史第7位,前6名5队最终夺冠直播吧1月23日讯英国媒体FootballDaily统计了英格兰顶级联赛前19场的最高积分,并列出榜单,20172018赛季曼城和20192020赛季利物浦以55分并列首位,本赛季内维尔现在的枪手就像20年前一样,但他们离获得冠军还差很远直播吧1月23日讯今天凌晨,阿森纳在主场32逆转曼联继续在联赛中领跑,赛后加里内维尔认为现在的阿森纳感觉就像20年前一样如此优秀。加里内维尔在他最新的天空体育播客中说我真的很喜欢,美双胞胎姐妹录节目赤身坐树林里谈心,观众调侃猎人来了怎么办人与人沟通有很多种方式,不管是用语言交流,还是用肢体表达,都是联系彼此的有效方式。而在一档美国电视真人秀节目中,一对姐妹与众不同的沟通方式却引起了热议。据英媒每日星报1月20日报道本来对仙剑六不抱希望,直到看见了破布造型,这剧我追了虞书欣在仙剑六中的造型不少,有的造型是乡村风情的破布风格,看起来略微有点朴素,但还是被虞书欣很好的撑了起来。另外,虞书欣还有仙气飘飘的蓝衣古装造型,各种造型集合于一体,给穿搭多了一美丽河北人间最美是今宵!万家灯火点亮除夕夜视频加载中又是一年除夕时多少相思奔赴多少祝福正在路上虎年的终点兔年的起点在这温馨团圆的时刻河北各地披上了节日的盛装大街小巷被大红灯笼和五颜六色的彩灯装扮得流光溢彩万家灯火烘托出浓浓春晚男主持阵容强大,女主持被嘲拉低档次,28岁王嘉宁首次亮相兔年央视春晚的主持阵容由任鲁豫撒贝宁尼格买提龙洋马凡舒王嘉宁,708090后老中青三代担任。如今的春晚主持人阵容越来越牵强,完全不及往年。董卿周涛朱迅李思思时代已经过去,令观众无比小托马斯17年手术后医生说我不能打球了但现在我身体感觉很好直播吧1月23日讯近日,网球运动员安迪穆雷更新了推特。他写道2天前我碰到了一位曾经给我做手术的医生。他在2017年告诉我,好消息是你的臀部问题可以解决,坏消息是你不能再参加职业比赛揭秘本山帝国从贫苦草根到东北王,赵本山如何坐拥300亿身价?01从草根到东北王揭秘赵本山百亿帝国直到看到这张照片,我才明白刘流的这句话有多正确。香港有向华强,北京有王朔,可连向华强都摆不平的事,就只能找赵本山了。2000年,刘德华在东北演出岳云鹏相声太无聊?若结合背后安排的用意,就会佩服他的能力2013年,郭德纲首登春晚,表演了一段相声败家子。此后,他每每谈起这段经历都离不开三个字太难了。一方面,难在创作。另一方面,难在众口难调。这么多年过去了,郭德纲没再登上春晚,但这些
速递丨广西开出全国首趟点对点返岗务工专列头条广西开出全国首趟点对点返岗务工专列日前,600名务工人员从广西桂林北站乘动车至广东深圳返岗务工,这是今年全国首趟点对点返岗务工专列,将有效缓解各大企业春节后用工短缺压力。今年,广东联通融入大湾区发展大局,全力助推高质量发展1月28日,全省高质量发展大会在广州召开。南方日报记者张梓望梁钜聪金镝张令摄1月28日,广东召开全省高质量发展大会,广东联通党委书记总经理郝立谦出席会议。学习高质量发展大会精神,面水滴公司CEO沈鹏发布全员信2023年保持合理盈利1月28日,水滴公司创始人兼CEO沈鹏在春节后第一个工作日发布全员信。沈鹏在信中表示,2023年水滴的发展策略是以用户为中心,在合理盈利的前提下,追求更高质量的创新和增长。2022昆仑通泰触摸屏基本编程一动作描述1。实现变频器的正反转,频率的读写二硬件设备1。昆仑通泰触摸屏McgsPro2。台达变频器VDFM系列三软件1。昆仑通泰触摸屏软件四软件操作步骤第一步,双击打开触摸屏软件变频空调和定频空调哪个好?买空调需要注意什么?很多人在买空调的时候总是纠结着买变频空调好还是买定频空调好,我也一样。最近打算给新家买一台空调,上网查了一下,发现满屏都是变频空调,定频空调几乎找不到,这样也好,至少不必再纠结是买Windows10或11突然停止响应?可能不是你的锅微软为Windows10和11用户提供了一种解决方法,这些用户注意到他们的开始菜单突然没有响应,并且某些应用程序无法打开或无法正常工作。据这家IT巨头称,与以前令人头疼的开始菜单和故宫要开分院,地址选在了这刚刚过去的春节假期故宫是热门旅游打卡地之一令人期待的是成立近百年的故宫博物院很快就要有分院了!就在不久前,立项筹备已近十年之久的故宫博物院北院区正式破土动工。项目位于北京西北郊,海越南的理发店为何理一次头价格那么贵?高达150元,又有哪些服务近些年来,随着社会的发展,人们也越来越注重自己的仪容仪表。剪头发可能就是每个人每经过一段时间就会干的一件事情。毕竟发型也是人仪容仪表的一部分,而且一个好的发型能够提升一个人整体的颜LGgram2023将于1月31日开启预售,搭载13代酷睿RTX3050IT之家1月28日消息,LGgram2023将于1月31日开启预售,将会搭载英特尔13代酷睿新品,而且配备RTX3050独显,支持VRR可变刷新率。在本月初的CES2023上,LG精打细算,i512650H版4999元,该选谁在Q4全球电脑销量大降之后,目前的笔记本和电脑市场时常可以看到很低价格的产品,也就不足为奇了。在去年这个时候,酷睿标压45W处理器笔记本就得5000元,而现在,价格不仅小降,还赠送蒸烤一体机,到底是不是智商税?使用3个月,讲一讲真实的感受随着人们生活条件慢慢变好,现在的家电也越来越高级。就比如说现在市面上比较火爆的微蒸烤一体机,既能蒸食物,又能当作烤箱做各种点心,甚至还能当做微波炉来加热食物,集多种功能为一身,看着