问题描述:
若干进程通过有限的共享缓冲区交换数据。其中,"生产者"进程不断写入,而"消费者"进程不断读出;共享缓冲区共有N个;任何时刻只能有一个进程可对共享缓冲区进行操作。
#define N 100
int count=0;
void producer ( void )
{
while ( TRUE )
{
produce_item ( );
if (count== N) sleep ( );
enter_item ( );
count=count+1;
if (count==1) wakeup (consumer)
}
}
void consumer( void )
{
while ( TRUE )
{
remove_item ( );
if (count==0) sleep ( );
enter_item ( );
count=count-1;
if (count==N-1) wakeup (producer )
}
}
算法摘要
对于生产者:
只有当缓冲区里为零的时候,这时候消费者才有可能睡觉;
对于消费者:
只有当缓冲区里装满的时候,这时候生产者才有可能睡觉。
导致的问题:类Spooler目录问题
缓冲区为空,消费者检查,得到count=0,但未睡觉的时候,被调度程序挂起,此时它将保留一个局部变量来存储count的值,此时生产者开始工作并向缓冲区内放入资源,当资源等于以后,向消费者发送唤醒信号,而此时消费者没有睡眠,等消费者被恢复以后,检查自己存储过的count,发觉它等于零,则开始睡眠,而生产者则不停生产,当缓冲区满了以后自己也开始睡眠,这时候他们就都处于睡眠状态。