package main
import "fmt"
import "time"
import "math/rand"
var quit, Consu chan int // 只开一个信道
var s[5] int
var sum, buf, flag int
var C int = 5
func create(id int){
for ;;{
if sum > 15{ //15 + 5(5个线程) = 20 (总的生产个数)
quit <- 0 //finished
}
for i := 0; i < id+1; i++{ //为每个线程设置生产效率
time.Sleep(time.Second)
}
s[id]++
sum++
buf++
}
}
func consume(id int){
for ;;{
R := rand.Intn(3)
if buf > 0{
for i := 0; i < C; i++{
if s[i] > 0{
s[i]--
buf--
fmt.Printf("%d号消费者消费了%d号商品\n", id, i)
break
}
}
for i := 0; i < R+1; i++{
time.Sleep(time.Second)
}
}else{
fmt.Printf("%d号消费者没有可以消费的商品\n", id)
time.Sleep(time.Second)
}
}
}
func main() {
count := C
quit = make(chan int) // 无缓冲
for i := 0; i < count; i++ {//生产者线程
go create(i)
}
for i:= 0; i < count; i++{//消费者线程
go consume(i)
}
for i := 0; i < count; i++ {
<-quit
}
}
go语言实现生产者与消费者问题
最新推荐文章于 2024-02-05 14:41:36 发布