废话不多说,直接上代码:
// 定义全局chan,存储票总数
var totalTickets chan int
var wg sync.WaitGroup
func main() {
// 初始化票数量:总票数10张
totalTickets = make(chan int, 2)
totalTickets <- 10
wg.Add(5)
go sell("售票口1")
go sell("售票口2")
go sell("售票口3")
go sell("售票口4")
go sell("售票口5")
wg.Wait()
fmt.Println("main over.")
}
func sell(name string) {
defer wg.Done()
rand.Seed(time.Now().UnixNano())
for {
residue, ok := <-totalTickets
if !ok {
fmt.Printf("%s: Sold Out 1\n", name)
break
}
if residue > 0 {
time.Sleep(time.Duration(rand.Intn(1000)) * time.Millisecond)
totalTickets <- residue - 1
fmt.Println(name, "售出1张票,余票:", residue)
} else {
fmt.Printf("%s: Sold Out 2\n", name)
close(totalTickets)
break
}
}
}