Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread fgergo
If you haven't studied concurrency before, I can't recommend any tutorials.
To start to learn about concurrency, I'd first recommend _some_
reading and theoretical background.

Concurrency is a complex concept. A "10x" multiplier estimation
compared to e.g. structured programming is probably right, definitely
not a 2x and probably not a 100x. Don't expect to become _proficient_
in concurrent programming in a couple of hours. Probably you won't be
able to download a couple of examples and start tinkering with them
successfully.

A good start is maybe:
https://golang.org/doc/faq#csp

Then maybe this:
https://en.wikipedia.org/wiki/Communicating_sequential_processes

The book is available for free:
http://www.usingcsp.com/cspbook.pdf

Don't expect to absorb the whole book in a couple of hours, it might
take from a couple of weeks to a few month to start to see how much
you still don't know.

As soon as you get a general understanding of concurrent concepts,
you'll most probably find adequate tutorials for yourself.

(To add to what Jan asked: for sharing code on golang-nuts please
share links to play.golang.org.)


On 3/1/19, mountain...@gmail.com  wrote:
> Is there a recommended tutorial?
>
> 在 2019年3月1日星期五 UTC+8下午12:21:58,Robert Engels写道:
>>
>> I think it would be helpful if you learned more about concurrent
>> programming. It is 10x harder, even with the simplifications that Go
>> offers. If you don’t understand the concepts you are going to struggle.
>> Start with some tutorials and work your way up.
>>
>> On Feb 28, 2019, at 10:14 PM, mount...@gmail.com  wrote:
>>
>> This is the stack information printed when blocking, how to see which G
>> blocking program?
>>
>> SIGABRT: abort
>> PC=0x7fff9ceabbf2 m=0 sigcode=0
>>
>> goroutine 0 [idle]:
>> runtime.pthread_cond_wait(0x1967620, 0x19675e0, 0x7fff)
>> /usr/local/go/src/runtime/sys_darwin.go:302 +0x51
>> runtime.semasleep(0x, 0x7fff5fbff670)
>> /usr/local/go/src/runtime/os_darwin.go:63 +0x85
>> runtime.notesleep(0x19673e0)
>> /usr/local/go/src/runtime/lock_sema.go:167 +0xe3
>> runtime.stoplockedm()
>> /usr/local/go/src/runtime/proc.go:2165 +0x8a
>> runtime.schedule()
>> /usr/local/go/src/runtime/proc.go:2565 +0x2d9
>> runtime.park_m(0xc72480)
>> /usr/local/go/src/runtime/proc.go:2676 +0xae
>> runtime.mcall(0x105722b)
>> /usr/local/go/src/runtime/asm_amd64.s:299 +0x5b
>>
>> goroutine 1 [semacquire]:
>> sync.runtime_Semacquire(0xc27794)
>> /usr/local/go/src/runtime/sema.go:56 +0x39
>> sync.(*WaitGroup).Wait(0xc27794)
>> /usr/local/go/src/sync/waitgroup.go:130 +0x64
>> cmd/go/internal/work.(*Builder).Do(0xc00023b0e0, 0xc0003ee3c0)
>> /usr/local/go/src/cmd/go/internal/work/exec.go:174 +0x38e
>> cmd/go/internal/run.runRun(0x195c300, 0xc1e0e0, 0x1, 0x1)
>> /usr/local/go/src/cmd/go/internal/run/run.go:137 +0x55b
>> main.main()
>> /usr/local/go/src/cmd/go/main.go:219 +0x7d4
>>
>> goroutine 5 [syscall]:
>> os/signal.signal_recv(0x0)
>> /usr/local/go/src/runtime/sigqueue.go:139 +0x9f
>> os/signal.loop()
>> /usr/local/go/src/os/signal/signal_unix.go:23 +0x22
>> created by os/signal.init.0
>> /usr/local/go/src/os/signal/signal_unix.go:29 +0x41
>>
>> goroutine 50 [select]:
>> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0,
>> 0xc0004b0620)
>> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
>> created by cmd/go/internal/work.(*Builder).Do
>> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
>>
>> goroutine 51 [select]:
>> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0,
>> 0xc0004b0620)
>> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
>> created by cmd/go/internal/work.(*Builder).Do
>> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
>>
>> goroutine 52 [syscall]:
>> syscall.Syscall6(0x7, 0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x0, 0x0,
>>
>> 0xc0002f43f0, 0x0, 0xce2400)
>> /usr/local/go/src/syscall/asm_darwin_amd64.s:41 +0x5
>> syscall.wait4(0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x90, 0x1566d60,
>> 0x14cc401)
>> /usr/local/go/src/syscall/zsyscall_darwin_amd64.go:34 +0x7b
>> syscall.Wait4(0x12006, 0xc50c74, 0x0, 0xc0002f43f0, 0x0, 0x1, 0x1)
>> /usr/local/go/src/syscall/syscall_bsd.go:129 +0x51
>> os.(*Process).wait(0xc0002fd4a0, 0xc34a00, 0xc50cf8, 0x0)
>> /usr/local/go/src/os/exec_unix.go:38 +0x7b
>> os.(*Process).Wait(0xc0002fd4a0, 0x15b89c8, 0x15b89d0, 0x15b89c0)
>> /usr/local/go/src/os/exec.go:125 +0x2b
>> os/exec.(*Cmd).Wait(0xc00052da20, 0x0, 0x0)
>> /usr/local/go/src/os/exec/exec.go:465 +0x5b
>> os/exec.(*Cmd).Run(0xc00052da20, 0x50, 0xcdf7c0)
>> /usr/local/go/src/os/exec/exec.go:309 +0x5c
>> cmd/go/internal/base.RunStdin(0xcdf7c0, 0x1, 0x1)
>> /usr/local/go/src/cmd/go/internal/base/base.go:162 +0x11e
>> 

Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread mountainfpf
Is there a recommended tutorial?

在 2019年3月1日星期五 UTC+8下午12:21:58,Robert Engels写道:
>
> I think it would be helpful if you learned more about concurrent 
> programming. It is 10x harder, even with the simplifications that Go 
> offers. If you don’t understand the concepts you are going to struggle. 
> Start with some tutorials and work your way up. 
>
> On Feb 28, 2019, at 10:14 PM, mount...@gmail.com  wrote:
>
> This is the stack information printed when blocking, how to see which G 
> blocking program?
>
> SIGABRT: abort
> PC=0x7fff9ceabbf2 m=0 sigcode=0
>
> goroutine 0 [idle]:
> runtime.pthread_cond_wait(0x1967620, 0x19675e0, 0x7fff)
> /usr/local/go/src/runtime/sys_darwin.go:302 +0x51
> runtime.semasleep(0x, 0x7fff5fbff670)
> /usr/local/go/src/runtime/os_darwin.go:63 +0x85
> runtime.notesleep(0x19673e0)
> /usr/local/go/src/runtime/lock_sema.go:167 +0xe3
> runtime.stoplockedm()
> /usr/local/go/src/runtime/proc.go:2165 +0x8a
> runtime.schedule()
> /usr/local/go/src/runtime/proc.go:2565 +0x2d9
> runtime.park_m(0xc72480)
> /usr/local/go/src/runtime/proc.go:2676 +0xae
> runtime.mcall(0x105722b)
> /usr/local/go/src/runtime/asm_amd64.s:299 +0x5b
>
> goroutine 1 [semacquire]:
> sync.runtime_Semacquire(0xc27794)
> /usr/local/go/src/runtime/sema.go:56 +0x39
> sync.(*WaitGroup).Wait(0xc27794)
> /usr/local/go/src/sync/waitgroup.go:130 +0x64
> cmd/go/internal/work.(*Builder).Do(0xc00023b0e0, 0xc0003ee3c0)
> /usr/local/go/src/cmd/go/internal/work/exec.go:174 +0x38e
> cmd/go/internal/run.runRun(0x195c300, 0xc1e0e0, 0x1, 0x1)
> /usr/local/go/src/cmd/go/internal/run/run.go:137 +0x55b
> main.main()
> /usr/local/go/src/cmd/go/main.go:219 +0x7d4
>
> goroutine 5 [syscall]:
> os/signal.signal_recv(0x0)
> /usr/local/go/src/runtime/sigqueue.go:139 +0x9f
> os/signal.loop()
> /usr/local/go/src/os/signal/signal_unix.go:23 +0x22
> created by os/signal.init.0
> /usr/local/go/src/os/signal/signal_unix.go:29 +0x41
>
> goroutine 50 [select]:
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
>
> goroutine 51 [select]:
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
>
> goroutine 52 [syscall]:
> syscall.Syscall6(0x7, 0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x0, 0x0, 
> 0xc0002f43f0, 0x0, 0xce2400)
> /usr/local/go/src/syscall/asm_darwin_amd64.s:41 +0x5
> syscall.wait4(0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x90, 0x1566d60, 
> 0x14cc401)
> /usr/local/go/src/syscall/zsyscall_darwin_amd64.go:34 +0x7b
> syscall.Wait4(0x12006, 0xc50c74, 0x0, 0xc0002f43f0, 0x0, 0x1, 0x1)
> /usr/local/go/src/syscall/syscall_bsd.go:129 +0x51
> os.(*Process).wait(0xc0002fd4a0, 0xc34a00, 0xc50cf8, 0x0)
> /usr/local/go/src/os/exec_unix.go:38 +0x7b
> os.(*Process).Wait(0xc0002fd4a0, 0x15b89c8, 0x15b89d0, 0x15b89c0)
> /usr/local/go/src/os/exec.go:125 +0x2b
> os/exec.(*Cmd).Wait(0xc00052da20, 0x0, 0x0)
> /usr/local/go/src/os/exec/exec.go:465 +0x5b
> os/exec.(*Cmd).Run(0xc00052da20, 0x50, 0xcdf7c0)
> /usr/local/go/src/os/exec/exec.go:309 +0x5c
> cmd/go/internal/base.RunStdin(0xcdf7c0, 0x1, 0x1)
> /usr/local/go/src/cmd/go/internal/base/base.go:162 +0x11e
> cmd/go/internal/run.buildRunProgram(0xc00023b0e0, 0xc0003ee3c0, 0x13999b3, 
> 0xc00023b150)
> /usr/local/go/src/cmd/go/internal/run/run.go:151 +0x26d
> cmd/go/internal/work.(*Builder).Do.func1(0xc0003ee3c0)
> /usr/local/go/src/cmd/go/internal/work/exec.go:107 +0x72
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:165 +0xbb
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
>
> goroutine 53 [select]:
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
>
> goroutine 24 [chan receive]:
> cmd/go/internal/base.processSignals.func1(0xc86f00)
> /usr/local/go/src/cmd/go/internal/base/signal.go:21 +0x34
> created by cmd/go/internal/base.processSignals
> /usr/local/go/src/cmd/go/internal/base/signal.go:20 +0x93
>
> rax0x104
> rbx0xea00
> rcx0x7fff5fbff488
> rdx0xea00
> rdi0x1967620
> rsi0xea01eb00
> rbp

Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread Robert Engels
I think it would be helpful if you learned more about concurrent programming. 
It is 10x harder, even with the simplifications that Go offers. If you don’t 
understand the concepts you are going to struggle. Start with some tutorials 
and work your way up. 

> On Feb 28, 2019, at 10:14 PM, mountain...@gmail.com wrote:
> 
> This is the stack information printed when blocking, how to see which G 
> blocking program?
> 
> SIGABRT: abort
> PC=0x7fff9ceabbf2 m=0 sigcode=0
> 
> goroutine 0 [idle]:
> runtime.pthread_cond_wait(0x1967620, 0x19675e0, 0x7fff)
> /usr/local/go/src/runtime/sys_darwin.go:302 +0x51
> runtime.semasleep(0x, 0x7fff5fbff670)
> /usr/local/go/src/runtime/os_darwin.go:63 +0x85
> runtime.notesleep(0x19673e0)
> /usr/local/go/src/runtime/lock_sema.go:167 +0xe3
> runtime.stoplockedm()
> /usr/local/go/src/runtime/proc.go:2165 +0x8a
> runtime.schedule()
> /usr/local/go/src/runtime/proc.go:2565 +0x2d9
> runtime.park_m(0xc72480)
> /usr/local/go/src/runtime/proc.go:2676 +0xae
> runtime.mcall(0x105722b)
> /usr/local/go/src/runtime/asm_amd64.s:299 +0x5b
> 
> goroutine 1 [semacquire]:
> sync.runtime_Semacquire(0xc27794)
> /usr/local/go/src/runtime/sema.go:56 +0x39
> sync.(*WaitGroup).Wait(0xc27794)
> /usr/local/go/src/sync/waitgroup.go:130 +0x64
> cmd/go/internal/work.(*Builder).Do(0xc00023b0e0, 0xc0003ee3c0)
> /usr/local/go/src/cmd/go/internal/work/exec.go:174 +0x38e
> cmd/go/internal/run.runRun(0x195c300, 0xc1e0e0, 0x1, 0x1)
> /usr/local/go/src/cmd/go/internal/run/run.go:137 +0x55b
> main.main()
> /usr/local/go/src/cmd/go/main.go:219 +0x7d4
> 
> goroutine 5 [syscall]:
> os/signal.signal_recv(0x0)
> /usr/local/go/src/runtime/sigqueue.go:139 +0x9f
> os/signal.loop()
> /usr/local/go/src/os/signal/signal_unix.go:23 +0x22
> created by os/signal.init.0
> /usr/local/go/src/os/signal/signal_unix.go:29 +0x41
> 
> goroutine 50 [select]:
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
> 
> goroutine 51 [select]:
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
> 
> goroutine 52 [syscall]:
> syscall.Syscall6(0x7, 0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x0, 0x0, 
> 0xc0002f43f0, 0x0, 0xce2400)
> /usr/local/go/src/syscall/asm_darwin_amd64.s:41 +0x5
> syscall.wait4(0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x90, 0x1566d60, 
> 0x14cc401)
> /usr/local/go/src/syscall/zsyscall_darwin_amd64.go:34 +0x7b
> syscall.Wait4(0x12006, 0xc50c74, 0x0, 0xc0002f43f0, 0x0, 0x1, 0x1)
> /usr/local/go/src/syscall/syscall_bsd.go:129 +0x51
> os.(*Process).wait(0xc0002fd4a0, 0xc34a00, 0xc50cf8, 0x0)
> /usr/local/go/src/os/exec_unix.go:38 +0x7b
> os.(*Process).Wait(0xc0002fd4a0, 0x15b89c8, 0x15b89d0, 0x15b89c0)
> /usr/local/go/src/os/exec.go:125 +0x2b
> os/exec.(*Cmd).Wait(0xc00052da20, 0x0, 0x0)
> /usr/local/go/src/os/exec/exec.go:465 +0x5b
> os/exec.(*Cmd).Run(0xc00052da20, 0x50, 0xcdf7c0)
> /usr/local/go/src/os/exec/exec.go:309 +0x5c
> cmd/go/internal/base.RunStdin(0xcdf7c0, 0x1, 0x1)
> /usr/local/go/src/cmd/go/internal/base/base.go:162 +0x11e
> cmd/go/internal/run.buildRunProgram(0xc00023b0e0, 0xc0003ee3c0, 0x13999b3, 
> 0xc00023b150)
> /usr/local/go/src/cmd/go/internal/run/run.go:151 +0x26d
> cmd/go/internal/work.(*Builder).Do.func1(0xc0003ee3c0)
> /usr/local/go/src/cmd/go/internal/work/exec.go:107 +0x72
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:165 +0xbb
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
> 
> goroutine 53 [select]:
> cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
> 0xc0004b0620)
> /usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
> created by cmd/go/internal/work.(*Builder).Do
> /usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a
> 
> goroutine 24 [chan receive]:
> cmd/go/internal/base.processSignals.func1(0xc86f00)
> /usr/local/go/src/cmd/go/internal/base/signal.go:21 +0x34
> created by cmd/go/internal/base.processSignals
> /usr/local/go/src/cmd/go/internal/base/signal.go:20 +0x93
> 
> rax0x104
> rbx0xea00
> rcx0x7fff5fbff488
> rdx0xea00
> rdi0x1967620
> rsi0xea01eb00
> rbp0x7fff5fbff520
> rsp0x7fff5fbff488
> r8 0x0
> r9 0x60
> r100x0
> 

Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread mountainfpf
This is the stack information printed when blocking, how to see which G 
blocking program?

SIGABRT: abort
PC=0x7fff9ceabbf2 m=0 sigcode=0

goroutine 0 [idle]:
runtime.pthread_cond_wait(0x1967620, 0x19675e0, 0x7fff)
/usr/local/go/src/runtime/sys_darwin.go:302 +0x51
runtime.semasleep(0x, 0x7fff5fbff670)
/usr/local/go/src/runtime/os_darwin.go:63 +0x85
runtime.notesleep(0x19673e0)
/usr/local/go/src/runtime/lock_sema.go:167 +0xe3
runtime.stoplockedm()
/usr/local/go/src/runtime/proc.go:2165 +0x8a
runtime.schedule()
/usr/local/go/src/runtime/proc.go:2565 +0x2d9
runtime.park_m(0xc72480)
/usr/local/go/src/runtime/proc.go:2676 +0xae
runtime.mcall(0x105722b)
/usr/local/go/src/runtime/asm_amd64.s:299 +0x5b

goroutine 1 [semacquire]:
sync.runtime_Semacquire(0xc27794)
/usr/local/go/src/runtime/sema.go:56 +0x39
sync.(*WaitGroup).Wait(0xc27794)
/usr/local/go/src/sync/waitgroup.go:130 +0x64
cmd/go/internal/work.(*Builder).Do(0xc00023b0e0, 0xc0003ee3c0)
/usr/local/go/src/cmd/go/internal/work/exec.go:174 +0x38e
cmd/go/internal/run.runRun(0x195c300, 0xc1e0e0, 0x1, 0x1)
/usr/local/go/src/cmd/go/internal/run/run.go:137 +0x55b
main.main()
/usr/local/go/src/cmd/go/main.go:219 +0x7d4

goroutine 5 [syscall]:
os/signal.signal_recv(0x0)
/usr/local/go/src/runtime/sigqueue.go:139 +0x9f
os/signal.loop()
/usr/local/go/src/os/signal/signal_unix.go:23 +0x22
created by os/signal.init.0
/usr/local/go/src/os/signal/signal_unix.go:29 +0x41

goroutine 50 [select]:
cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
0xc0004b0620)
/usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
created by cmd/go/internal/work.(*Builder).Do
/usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a

goroutine 51 [select]:
cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
0xc0004b0620)
/usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
created by cmd/go/internal/work.(*Builder).Do
/usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a

goroutine 52 [syscall]:
syscall.Syscall6(0x7, 0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x0, 0x0, 
0xc0002f43f0, 0x0, 0xce2400)
/usr/local/go/src/syscall/asm_darwin_amd64.s:41 +0x5
syscall.wait4(0x12006, 0xc50c24, 0x0, 0xc0002f43f0, 0x90, 0x1566d60, 
0x14cc401)
/usr/local/go/src/syscall/zsyscall_darwin_amd64.go:34 +0x7b
syscall.Wait4(0x12006, 0xc50c74, 0x0, 0xc0002f43f0, 0x0, 0x1, 0x1)
/usr/local/go/src/syscall/syscall_bsd.go:129 +0x51
os.(*Process).wait(0xc0002fd4a0, 0xc34a00, 0xc50cf8, 0x0)
/usr/local/go/src/os/exec_unix.go:38 +0x7b
os.(*Process).Wait(0xc0002fd4a0, 0x15b89c8, 0x15b89d0, 0x15b89c0)
/usr/local/go/src/os/exec.go:125 +0x2b
os/exec.(*Cmd).Wait(0xc00052da20, 0x0, 0x0)
/usr/local/go/src/os/exec/exec.go:465 +0x5b
os/exec.(*Cmd).Run(0xc00052da20, 0x50, 0xcdf7c0)
/usr/local/go/src/os/exec/exec.go:309 +0x5c
cmd/go/internal/base.RunStdin(0xcdf7c0, 0x1, 0x1)
/usr/local/go/src/cmd/go/internal/base/base.go:162 +0x11e
cmd/go/internal/run.buildRunProgram(0xc00023b0e0, 0xc0003ee3c0, 0x13999b3, 
0xc00023b150)
/usr/local/go/src/cmd/go/internal/run/run.go:151 +0x26d
cmd/go/internal/work.(*Builder).Do.func1(0xc0003ee3c0)
/usr/local/go/src/cmd/go/internal/work/exec.go:107 +0x72
cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
0xc0004b0620)
/usr/local/go/src/cmd/go/internal/work/exec.go:165 +0xbb
created by cmd/go/internal/work.(*Builder).Do
/usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a

goroutine 53 [select]:
cmd/go/internal/work.(*Builder).Do.func2(0xc27794, 0xc00023b0e0, 
0xc0004b0620)
/usr/local/go/src/cmd/go/internal/work/exec.go:155 +0x12f
created by cmd/go/internal/work.(*Builder).Do
/usr/local/go/src/cmd/go/internal/work/exec.go:152 +0x36a

goroutine 24 [chan receive]:
cmd/go/internal/base.processSignals.func1(0xc86f00)
/usr/local/go/src/cmd/go/internal/base/signal.go:21 +0x34
created by cmd/go/internal/base.processSignals
/usr/local/go/src/cmd/go/internal/base/signal.go:20 +0x93

rax0x104
rbx0xea00
rcx0x7fff5fbff488
rdx0xea00
rdi0x1967620
rsi0xea01eb00
rbp0x7fff5fbff520
rsp0x7fff5fbff488
r8 0x0
r9 0x60
r100x0
r110x202
r120x1967620
r130x16
r140x1
r150x7fffa5c9d3c0
rip0x7fff9ceabbf2
rflags 0x203
cs 0x7
fs 0x0
gs 0x0

在 2019年2月28日星期四 UTC+8下午8:44:55,Sameer Ajmani写道:
>
> The deadlock happens because the channel is empty, so the receive 
> operation blocks forever.
>
> The second version imports a package that may start new goroutines in its 
> init functions. If so, those goroutines may not be deadlocked, but the main 
> function is still blocked on the receive operation.
>
> It can be useful to send SIGQUIT to a 

Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread howardcshaw
Sameer is correct, but to be clear - The *block* happens because the 
channel is empty, so the receive operation blocks forever. This happens in 
both of the cases you show.

The *deadlock* happens because *all* goroutines are blocked and none can 
continue. So if you start some other goroutine that is not blocked, you 
won't have a deadlock, even though your main routine is blocked forever, 
which you are inadvertently doing by that import. Or, more to the point, 
you have a deadlock that Go can't detect as such - because technically, 
there is a goroutine running that could at some point read from that 
channel and your main routine would be unblocked and continue. It won't, 
because it has no reference to it, but the compiler is not currently able 
to detect that.

Again, both cases actually block. It is merely that in the first case the 
compiler can detect that it is a 'forever-blocked' situation and kills the 
program with a warning that it was deadlocked.

Howard

-- 
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.


Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread Sameer Ajmani
The deadlock happens because the channel is empty, so the receive operation
blocks forever.

The second version imports a package that may start new goroutines in its
init functions. If so, those goroutines may not be deadlocked, but the main
function is still blocked on the receive operation.

It can be useful to send SIGQUIT to a blocked Go program to dump the
goroutine stack traces to the terminal.

S

On Thu, Feb 28, 2019 at 4:19 AM  wrote:

> dead lock:
>
> package main
>
> import (
> "fmt"
> // _ "github.com/go-sql-driver/mysql"
> )
>
> func main() {
> c1 := make(chan int, 10)
> fmt.Println(<-c1)
> }
>
>
> block:
>
> package main
>
> import (
> "fmt"
>
> _ "github.com/go-sql-driver/mysql"
> )
>
> func main() {
> c1 := make(chan int, 10)
> fmt.Println(<-c1)
> }
>
> --
> 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.
>

-- 
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.


Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread mountainfpf
ok, thanks!

在 2019年2月28日星期四 UTC+8下午5:49:48,Jan Mercl写道:
>
> On Thu, Feb 28, 2019 at 10:20 AM > wrote:
>
> Please do not post colorized source code, particularly not using low 
> contrast, inverted color schemes. There are people not able to read it. 
> Some others may just ignore it or even consider it bad netiquette.
>
> Black on white is the most universally readable option. Thanks.
>
> -- 
>
> -j
>

-- 
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.


Re: [go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread Jan Mercl
On Thu, Feb 28, 2019 at 10:20 AM  wrote:

Please do not post colorized source code, particularly not using low
contrast, inverted color schemes. There are people not able to read it.
Some others may just ignore it or even consider it bad netiquette.

Black on white is the most universally readable option. Thanks.

-- 

-j

-- 
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.


[go-nuts] I found a very strange code that would cause deadlocks and blocking,why???

2019-02-28 Thread mountainfpf
dead lock:

package main

import (
"fmt"
// _ "github.com/go-sql-driver/mysql"
)

func main() {
c1 := make(chan int, 10)
fmt.Println(<-c1)
}


block:

package main

import (
"fmt"

_ "github.com/go-sql-driver/mysql"
)

func main() {
c1 := make(chan int, 10)
fmt.Println(<-c1)
}

-- 
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.