先备知识:goroutine、go的并发与并行、channels
用Golang实现这个经典的并发模型,就是要用到goroutine和channel啦~
伪代码
转载自:https://blog.youkuaiyun.com/yongf2014/article/details/46493129
操作系统课上学过,回顾一下。(说起来,还要抽时间重学一遍OS)
int in=0,out=0;
semaphore empty,full,mutex;
empty.value=n; //空缓冲区资源信号量,初始状态有n个空的缓冲区
full.value=0; //满缓冲区资源信号量,初始状态有0个满缓冲区
mutex.value=0; //缓冲区互斥访问量
void producer() //生产者程序
{
while(true)
{
item=producerItem(); //生产一个产品
p(empty); //申请一个空缓冲区。如有,继续执行;否则,此处进程挂起
p(mutex); //如果没有其他进程访问缓冲区,继续执行;否则,进程挂起
putItemIntoBuffer(item); //将产品放入缓冲区
in=(in+1)mod n; //修改指针位置
v(mutex); //解锁,离开缓冲区,如果有其他进程等待进入,则唤醒
v(full); //增加一个满缓冲区,如果有消费者等待,则唤醒
}
}
void consumer() //消费者程序
{
while(true