Hi, I found when running this code below (play 
<https://play.golang.org/p/XyxV_1f6Ri>):


package main
import "fmt"
import "runtime"
import "time"
type callRet struct {
ret int
}
type callIn struct {
ret_chan chan *callRet
arg1     int
}
func caller(call_in_c chan *callIn, arg1 int) int {
ret_c := make(chan *callRet, 1)
ci := callIn{ret_c, arg1}
t1 := time.Now().UnixNano()
call_in_c <- &ci
ret := <-ret_c
t2 := time.Now().UnixNano()
_, _ = t1, t2
//fmt.Println(t2, t1, float64(t2-t1)/1e6)
return ret.ret
}
func call_srv(call_in_c chan *callIn) {
//runtime.LockOSThread()
ct := 0
for {
select {
case in := <-call_in_c:
ret_c := in.ret_chan
ret := callRet{3 + in.arg1}
ret_c <- &ret
ct++
if ct%1000 == 0 {
fmt.Println(ct)
}
//default:
// time.Sleep(1 * time.Millisecond)
}
}
//runtime.UnlockOSThread()
}
func init() {
//runtime.LockOSThread()
}
func main() {
p := fmt.Println
runtime.GOMAXPROCS(5)
call_in_c := make(chan *callIn, 2000)
fp := func(call_in_c chan *callIn) {
ct := 0
for ; ct < 2000000; ct = ct + 1 {
caller(call_in_c, 1)
time.Sleep(100 * time.Nanosecond)
}
p("done:)")
}
go fp(call_in_c)
go fp(call_in_c)
go func() {
for {
fmt.Println("heartbeat...")
time.Sleep(10 * 1000 * time.Microsecond)
}
}()

                   // after delete this little piece code, it will be ok

go func() {     
for {
}
}()

                   // -^

call_srv(call_in_c)
return
}

It will always “stuck” in certain time after start executing (tested in 
both go 1.7 , 1.8.1 and 1.8.3, 
and you should run it on your own computer, not on the play because it 
would cost several seconds). 
I have checked the code above dozens of times at least and sure it is all 
right.

I tried to attach the go process with gdb when it is stuck and the `bt` 
yielded this:


> (gdb) info goroutines
>   1 waiting  runtime.gopark
>   2 waiting  runtime.gopark
>   3 waiting  runtime.gopark
>   4 waiting  runtime.gopark
>   5 waiting  runtime.gopark
> * 6 running  runtime.systemstack_switch
>   7 waiting  runtime.gopark
> * 8 running  main.main.func3
>   17 runnable runtime.exitsyscall
>   33 waiting  runtime.gopark
>   18 waiting  runtime.gopark
>   49 waiting  runtime.gopark
>   50 waiting  runtime.gopark
>   51 waiting  runtime.gopark
> (gdb) goroutine 6 bt
> #0  runtime.systemstack_switch () at 
> /usr/local/go/src/runtime/asm_amd64.s:281
> #1  0x0000000000415088 in runtime.gcStart (mode=0, forceTrigger=false)
>     at /usr/local/go/src/runtime/mgc.go:1010
> #2  0x000000000040d841 in runtime.mallocgc (size=96, typ=0x4a7fa0, 
> needzero=true,
>     ~r3=0x507998 <runtime.timers+24>) at 
> /usr/local/go/src/runtime/malloc.go:785
> #3  0x000000000040df68 in runtime.newobject (typ=0x4a7fa0, ~r1=0x0)
>     at /usr/local/go/src/runtime/malloc.go:820
> #4  0x00000000004035d2 in runtime.makechan (t=0x492960, size=1, 
> ~r2=0xc4200016c0)
>     at /usr/local/go/src/runtime/chan.go:92
> #5  0x00000000004840e4 in main.caller (call_in_c=0xc420056060, arg1=1, 
> ~r2=0)
>     at /root/go/src/chan/x.go:18
> #6  0x00000000004846ac in main.main.func1 (call_in_c=0xc420056060) at 
> /root/go/src/chan/x.go:62
> #7  0x000000000044da21 in runtime.goexit () at 
> /usr/local/go/src/runtime/asm_amd64.s:2197
> #8  0x000000c420056060 in ?? ()
> #9  0x0000000000000000 in ?? ()



-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to