go协程实现消费者生产者模型

问题

一个饼框里可以放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() //主进程等待协程执行完毕再退出
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值