先理解下缓冲区中最多同时有BUFFER_SIZE-1个项的方案:感觉这个方案的算法挺经典的!!
#define BUFFER_SIZE 10
typedf struct{
...
}item;
item buffer[BUFFER_SIZE];
int in=0;
int out=0;
生产者进程代码:
while(1)
{
/*produce an item in nextProduced*/
while((in+1)%BUFFER_SIZE)==out);
buffer[in]=nextProdeced;
in=(in+1)%BUFFER_SIZE;
}
消费者进程代码:
while(1)
{
while(in==out);
nextConsumed=buffer[out];
out=(out+1)%BUFFER_SIZE;
/* consume the item in nextConsumed*/
}
理解:对缓冲区的共享是通过循环数组buffer和两个逻辑指针in out来实现的。
in和out是从0到BUFFER_SIZE-1,再从0到BUFFER_SIZE-1这样一遍一遍的循环的 通过语句in=(in+1)%BUFFER_SIZE;
当in==out时,表示缓冲区为空(注意,其实不是真的缓冲区中没有数据,只是缓冲区中的数据都被消费过了,没有最新的)
这是消费者要考虑的
当(in+1)%BUFFER_SIZE==out表示缓冲为满(这儿表示缓冲区中的有BUFFER_SIZE-1个数据是新的,没有被消费过的)
这是生产者要考虑的
关于缓冲区中同时能存储BUFFER_SIZE个项的解决方案:
in flag=0;
修改生产者进程代码为:
while(1)
{
/*produce an item in nextProduced*/
while((in+1)%BUFFER_SIZE)==out)
{
if(!flag)
{
flag=1;
buffer[in]=nextProduced;
}
}
if(!flag)
buffer[in]=nextProdeced;
in=(in+1)%BUFFER_SIZE;
flag=0;
}