问题
一个饼框里可以放10个饼,生产者2秒钟生产一个饼,消费者1秒钟消费一个饼,实现这个饼框资源的同步和互斥。
生产者
饼框加锁;
饼不够10个:
生产饼
释放锁
改变条件变量
睡眠2秒
消费者
饼框加锁
判断是否有饼(饼个数),没饼:
条件变量设置为不满足
有饼:
消费饼
释放锁
睡眠1秒
Go协程实现
package main
import (
"fmt"
"sync"
"time"
)
//一个消费者,一个生产者,一个篮子放10个饼
var mutex sync.Mutex //互斥锁
var cond = sync.Cond{L: &mutex} //互斥锁协同的信号量
var wg sync.WaitGroup //协程计数器,每开启一个协程加1,完成一个减1,所有协程完成,主进程退出
var count = 0
var max_count = 10
func Producer() {
defer wg.Done()
for {
//加锁
cond.L.Lock()
//生产资源,如果count<10,则生产并
//否则直接唤醒条件变量及释放锁
if count < max_count {
count++
fmt.Println("producer give count:", count)
} else {
fmt.Println("count has engouh")
}
cond.L.Unlock()
cond.Signal()
//睡眠2秒
time.Sleep(time.Second)
}
}
//消费者
func Consumer() {
defer wg.Done()
for {
//加锁
cond.L.Lock()
//若没有饼
if count <= 0 {
cond.Wait()
fmt.Println("count is 0")
} else {
count--
fmt.Println("consumer get count:", count)
}
//释放锁
cond.L.Unlock()
//睡眠1秒
time.Sleep(2 * time.Second)
}
}
func main() {
go Producer()
wg.Add(1)
go Consumer()
wg.Add(1)
wg.Wait() //主进程等待协程执行完毕再退出
}