why not just  drop the select? i think the following is guaranteed because
putting things on rc has to succeed before putting true into dc:

package main

import (
"fmt"
)

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

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


On Tue, Dec 18, 2018 at 5:35 AM Chris Burkert <burkert.ch...@gmail.com>
wrote:

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

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