我有一个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()
,一切运行良好。