问题

一个饼框里可以放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() //主进程等待协程执行完毕再退出
}