On Wed, Oct 24, 2018 at 11:17 AM Sathish VJ <sathis...@gmail.com> wrote:
>
> Thank you.  Would you have an explanation for why it works so differently 
> from using default?

The codepath that causes the deadlock is :
 - main reads from c
 - f() runs select, quit is not writable, so selects default, which
starts waiting on c
 - main waits on quit



>
> On Wednesday, 24 October 2018 22:44:26 UTC+5:30, Burak Serdar wrote:
>>
>> You can do this instead:
>>
>> https://play.golang.org/p/avMIyYlwxbF
>> On Wed, Oct 24, 2018 at 11:05 AM Sathish VJ <sath...@gmail.com> wrote:
>> >
>> > This is a program where the receiver is asking the sender to close after 
>> > receiving 1 value.  Using default for the sending (line 34) causes the 
>> > code to deadlock while even a timeout of a nanosecond causes it to be ok.
>> > I don't want to time the sending though.  Is there a better option to 
>> > sequence this code?
>> > Is using default not an option here at all?
>> >
>> > https://play.golang.org/p/30sI9RYJ1Ed
>> >
>> > package main
>> >
>> > import "fmt"
>> > //import "time"
>> >
>> > var c = make(chan string)
>> > var quit = make(chan bool)
>> >
>> > func main() {
>> > go fn()
>> >
>> > for {
>> > select {
>> > case msg, ok := <-c:
>> > if !ok {
>> > c = nil
>> > return
>> > } else {
>> > fmt.Println("received: ", msg)
>> > quit <- true
>> > }
>> > }
>> > }
>> > }
>> >
>> > func fn() {
>> > for {
>> > select {
>> > case <-quit:
>> > fmt.Println("closin chan c")
>> > close(c)
>> > return
>> > //case <-time.After(time.Nanosecond):  // this is ok
>> > default:                               // using default causes deadlock
>> > c <- "Image"
>> > }
>> > }
>> > }
>> >
>> >
>> >
>> > received:  Image
>> > fatal error: all goroutines are asleep - deadlock!
>> >
>> > goroutine 1 [chan send]:
>> > main.main()
>> > /tmp/sandbox497027958/main.go:20 +0x100
>> >
>> > goroutine 5 [chan send]:
>> > main.fn()
>> > /tmp/sandbox497027958/main.go:35 +0x40
>> > created by main.main
>> > /tmp/sandbox497027958/main.go:10 +0x40
>> >
>> >
>> >
>> > --
>> > 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...@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.

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