Dear all,

I have a couple of goroutines sending multiple results over a channel - a
simple fan-in. They signal the completion on a done channel. Main selects
on the results and done channel in parallel. As the select is random main
sometimes misses to select the last result. What would be the idiomatic way
to prevent this and completely drain the result channel?

Here is a minmal example which sometimes prints one 0 but should always
print two of them:

package main

import (
        "fmt"
)

func do(rc chan<- int, dc chan<- bool) {
        rc <- 0
        dc <- true
}

func main() {
        worker := 2
        rc := make(chan int, worker)
        done := 0
        dc := make(chan bool, worker)
        for i := 0; i < worker; i++ {
                go do(rc, dc)
        }
        for done < worker {
                select {
                case <-dc:
                        done++
                case r := <-rc:
                        fmt.Println(r)
                }
        }
}

many thanks
Chris

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