假设缓冲区大小为10,生产者、消费者若干。只要缓冲区池未满,生产者便可以将消息送入缓冲区池,只要缓冲区池未空,消费者便可以从缓冲区中取走一个消息。
- items:代表缓冲区可使用的资源数,space代表缓冲区可用资源数;
- mutex:表示互斥锁;
- buf[10]:代表缓冲区,内容类型为item;
- in、out:代表第一个资源和最后一个资源(i即in最早产生的资源)
伪代码如下:
var items=0,sapce=10,mutex=1;
var in=0,out=0;
item buf[10]={NULL};
producer
{
while(true)
{
P(space);//等待缓冲区有空闲位置,在使用PV操作时,条件变量需要在互斥锁之前
P(mutex);//保证在product时不会有其他进程访问缓冲区
//product
buf.push(item,in); //将新资源放到buf[in]位置
in=(in+1)%10;
V(mutex);
V(items);
}
}
consumer
{
while(true)
{
P(items); //等待缓冲区有资源可以使用
P(mutex); //保证在consume时不会有其他线程访问缓冲区
//consume
buf.pop(out); //将buf[out]位置的资源取走
out=(out+1)%10;
V(mutex);
V(space);
}
}