我有以下代码。这是一个学习练习,因此它没有做任何明显有用的事情。如果 wg.Add 值为 1,它就会起作用。如果 wg.Add 值为 2,它就会失败。如果我删除通道逻辑,它就会在 wg.Add 值为 2 的情况下起作用。
对我做错的事情有什么想法吗?
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)
}
}