Eu tenho o seguinte código. É um exercício de aprendizado, então ele não faz nada obviamente útil. Se o valor wg.Add for 1, ele funciona. Se o valor wg.Add for 2, ele falha. Se eu remover a lógica do canal, ele funciona com um valor wg.Add de 2.
Alguma ideia do que estou fazendo errado?
package main
import (
"fmt"
"sync"
)
func popMessage(wg *sync.WaitGroup, m *sync.Mutex, i *int, c chan<- int) {
m.Lock()
*i++
c <- *i
m.Unlock()
fmt.Printf("pop %d\n", *i)
wg.Done()
}
func main() {
var wg sync.WaitGroup
var m sync.Mutex
var intPtr *int
c := make(chan int, 1)
wg.Add(2)
intPtr = new(int)
*intPtr = 1
go popMessage(&wg, &m, intPtr, c)
go popMessage(&wg, &m, intPtr, c)
go popMessage(&wg, &m, intPtr, c)
wg.Wait()
fmt.Printf("final %d\n", *intPtr)
for x := range c {
fmt.Printf("channel %d\n", x)
}
}