按道理,运行时在运行其他用户协程时,才应该执行抢占。运行时的调度代码不应该被抢占。那么,收到抢占信号处理时,如何判定当前是谁被中断执行?
在代码中,有如下代码:
func isAsyncSafePoint(gp *g, pc, sp, lr uintptr) (bool, uintptr) {
mp := gp.m
// Only user Gs can have safe-points. We check this first
// because it's extremely common that we'll catch mp in the
// scheduler processing this G preemption.
if mp.curg != gp {
return false, 0
}
........
但是对if mp.curg != gp 判断有疑问。
比如在调度代码中有下面这样的代码:
1 mp.curg = 用户协程g
2 切换到用户协程g
在执行1之后,未执行2之前收到了抢占信号,上面的判断语句 if mp.curg != gp 失效,不会返回false, 导致调度代码被抢占。
是否这样理解?
手机输入,若格式有问题,请谅解。
有疑问加站长微信联系(非本文作者)