次のようなgolangコードのサンプルがあります(xx.go):
package main
import "runtime"
func main() {
c2 := make(chan int)
go func() {
for v := range c2 {
println("c2 =", v, "numof routines:", runtime.NumGoroutine())
}
}()
for i:=1;i<=10001;i++{
c2 <- i
//runtime.Gosched()
}
}
- ループ回数が奇数の場合、たとえば 10001 の場合、コードはすべての数値を出力します。
- ループ回数が偶数の場合、たとえば 10000 の場合、コードは最後の!以外のすべての数値を出力します。
何故ですか?
私は 2 から 10000 までの数をテストしましたが、それらはすべて上記の規則に従います!
ENV は次のとおりです。
uname -a : Linux hadoopnode25232 2.6.18-308.16.1.el5 #1 SMP Tue Oct 2 22:01:43 EDT 2012 x86_64 x86_64 x86_64 GNU/Linux
go version : go version go1.1 linux/amd64
go schedと関係があると思います。
コードを組み立てます:
go tool 6g -S xx.go > xx.s
10000 と 10001 の唯一の違いは次のとおりです。
33c33
< 0030 (xx.go:20) CMPQ AX,$10001
---
> 0030 (xx.go:20) CMPQ AX,$10000
最後になりましたが、追加するruntime.Gosched()
と、すべてが正常に実行されます。