对并发的粒度的认知

Interleaving

依然,我不太清楚这个术语Interleaving怎么翻译好,看到有前人翻译成顺序交错,我们就用这个译名好了。
顺序交错是指当有多个协程共同工作时,代码的执行顺序会有多种可能性。

并发发生在机器码等级

并发发生在机器码等级,而不是源代码等级。也就是说Interleaving并不是Go 源代码的Interleaving,而是底层的机器码指令的Interleaving。不管您的平台是什么,Go 源代码都会被编译成机器。这些机器码指令是一系列比源代码更小的指令,这些指令才是实际造成interleaving的源头。总之,每一条Go源代码指令,都可以被编译成一连串机器码指令。所以Interleving可以在一条Go源代码指令的执行阶段被拆分成数段或者说被中断。

一个例子

我们依然可以用i=i+1这个例子来进行说明。
i=i+1可以被看成三条机器码指令:

  1. read i
  2. increment
  3. write i

第一步是CPU先将i从存储单元里读取出i,然后我们需要知道的是我们的机器是基于寄存器的,所以这个increament 操作会把i写入一个寄存器,并进行算术运算,最后再把结果写回存储单元中。
因为并发是发生在机器码等级,所以当你在执行条源代码指令i=i+1的时候,i的值完全有可能被其它也操作i的协程改变。
在这里插入图片描述

如上图,假如有两个协程,都要执行i=i+1这条语句。只了解Go源代码的程序员对i的预期结果可能是2。但是我们通过把两条语句编译成机器码指令可以发现,因为两个读操作(1和2)可能是紧接着发生的两个指令,也就是说此时Task 1读到的i的值是0,Task2读到的i的值也是0,那两个任务分别对i进行自加1操作后,最后写回存储单元的i的值还是1,而不是预期的2。
最后的总结就是“Interleaving machine instructions causes unexpected problems" 代码执行顺序交错的机器指令会导致不可预料的结果。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值