问题描述:设有n个缓冲区,一组生产者进程往缓冲区写数据,一组消费者进程从缓冲区取数据,写取以一个缓冲区为单位。
说明:
将缓冲池看作是共享数据,对缓冲区的操作必须是互斥操作。
如果n个缓冲区全满,生产者进程必须等待。
如果缓冲区全空,消费者进程必须等待。
如果n个缓冲区全满,生产者进程必须等待。
如果缓冲区全空,消费者进程必须等待。
设置以下信号量
互斥: mutex,初值为1,控制互斥访问缓冲池。
同步: full,初值为0,表示当前缓冲池中满缓冲区数。
empty,初值为N,表示当前缓冲池中空缓冲区数。
互斥: mutex,初值为1,控制互斥访问缓冲池。
同步: full,初值为0,表示当前缓冲池中满缓冲区数。
empty,初值为N,表示当前缓冲池中空缓冲区数。
有限缓冲区问题解决:
main(){
int mutex=1;
int empty=n;
int full=0;
Cobegin
P1();
p2();
Coend
}
生产者与消费者的同步关系:
生产者:当有界缓冲区中无空位置时,要等待;
向有界缓冲区放入物品后,要发消息;
消费者:当有界缓冲区中无物品时,要等待;
从有界缓冲区取出物品后,要发消息;
//进程P1:
p1()
{
while(生产未完成)
{
...
p(empty);
p(mutex);
送一个产品到有界缓冲区:
v(mutex);
v(full);
}
}
//进程P2:
P2()
{
while(还要继续消费)
{
p(full);
p(mutex);
从有界缓冲区中取产品:
v(empty);
v(mutex);
消费一个产品:
...
}
}
特别注意,无论是在消费者还是生产者进程中,V操作的次序无关紧要,但两个P操作的次序却不能颠倒,否则可能导致死锁:empty为0,full为n时,易发生死锁:生产者见到mutex为绿灯后进入,将mutex置为红灯;此时empty为0,则等待,这时消费者无法进入消费(mutex为红灯)。