runnext的抢占是如何发生的

runnext的抢占是如何发生的



http://img1.sycdn.imooc.com//climg/60a1107d09fd15ca09980462.jpg
这个cas指令是怎么做到:
1、 返回true代表新的g抢占成功
2、 返回false代表等待正在执行的g的呢
是什么条件判断的抢占成功呢?
还就就是想看这个cas的详细内容点进去是个没有实现的函数,如下图
http://img1.sycdn.imooc.com//climg/60a1108909589b6f19041082.jpg

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Xargin 2021-05-16 20:36:41

runnext 只是 P 结构体的一个字段,替换就是就是把 old 值保存下来,new 值塞进去就行了。。这里不叫抢占,抢占是要把正在执行的那些 goroutine 停下来

  • 不是还有个等待老的g执行完再抢占的逻辑么。要是单纯CAS没有什么判断逻辑的话,理论上每次都能成功吧

    2021-05-16 20:49:12
  • 咋看这种没有实现的代码呢?

    http://img1.sycdn.imooc.com//climg/60a1108909589b6f19041082.jpg

    2021-05-16 20:56:58
  • Xargin 回复 提问者 weixin_慕移动6186909 #3

    等待老的执行完,这时候是线程进 schedule 调度循环,会检查自己绑定的那个 P 有没有 runnext, 有的话就执行了,这个不是抢占逻辑,就是调度循环里的正常 runqget 的逻辑。

    2021-05-16 23:23:37
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师