Skip to content

ゴルーチンIDは再利用されない

Go 1.22.5時点では、lgoid を割り当てしているところは2箇所あるが、 oneNewExtraM では最新の値をインクリメントしている。

// func oneNewExtraM()
gp.goid = sched.goidgen.Add(1)

もうひとつは newproc1 にあって、まとめて確保したIDを順番に割り当てしている。おそらくパフォーマンス向上のためだろう。

// func newproc1(fn *funcval, callergp *g, callerpc uintptr)
if pp.goidcache == pp.goidcacheend {
// Sched.goidgen is the last allocated id,
// this batch must be [sched.goidgen+1, sched.goidgen+GoidCacheBatch].
// At startup sched.goidgen=0, so main goroutine receives goid=1.
pp.goidcache = sched.goidgen.Add(_GoidCacheBatch)
pp.goidcache -= _GoidCacheBatch - 1
pp.goidcacheend = pp.goidcache + _GoidCacheBatch
}
newg.goid = pp.goidcache
pp.goidcache++

なので、順番が前後することはあるが、過去に使用したゴルーチンIDが再利用されることはない。