单生产者P—单消费者C—单缓冲区B问题
1)进程互斥问题:缓冲区B是临界资源,进程P和C不能同时对B进行操作,即只能互斥的操作
2)进程同步问题:P不能往“满”的的缓冲区B放产品,C不能从空的缓冲区获得产品。当缓冲区满时,C必须先于P执行,当缓冲区空时,P必须先于C执行;
我们给出如下基于记录型(二元)信号量机制的解法
- // [10/9/2013 qingezha] 1生产者-1消费者-1缓冲区
- //P进程不能往满的缓冲区放产品,设置信号量为s1
- //C进程不能从空的缓冲区取得产品,设置信号量为s2
- //s1的初值为1 ,s2的初值为0,因为只有先生产产品才可以接着消费产品
- //P:
- while (1)
- {
- //生产产品
- P(s1);//获得B
- //向B放产品
- V(s2);//通知C取产品
- }
- //C:
- while (1)
- {
- P(s2);//得到通知,获得B
- //取产品
- V(s1);//通知P生产
- //消费产品
- }
// [10/9/2013 qingezha] 1生产者-1消费者-1缓冲区
//P进程不能往满的缓冲区放产品,设置信号量为s1
//C进程不能从空的缓冲区取得产品,设置信号量为s2
//s1的初值为1 ,s2的初值为0,因为只有先生产产品才可以接着消费产品
//P:
while (1)
{
//生产产品
P(s1);//获得B
//向B放产品
V(s2);//通知C取产品
}
//C:
while (1)
{
P(s2);//得到通知,获得B
//取产品
V(s1);//通知P生产
//消费产品
}
单生产者P—单消费者C—多缓冲区B问题
1)进程互斥问题:缓冲区B是临界资源,进程P和C不能同时对B进行操作,即只能互斥的操作
2)进程同步问题:P不能往“满”的的缓冲区B放产品,C不能从空的缓冲区获得产品。当缓冲区满时,C必须先于P执行,当缓冲区空时,P必须先于C执行;但是这里缓冲区大小为n,所以不能简单的使用互斥信号量来表示。
我们给出如下基于(多元)信号量机制的解法
- // [10/9/2013 qingezha] 1生产者-1消费者-多缓冲区
- //P进程不能往满的缓冲区放产品,设置信号量为s1
- //C进程不能从空的缓冲区取得产品,设置信号量为s2
- //s1的初值为n ,s2的初值为0,因为只有先生产产品才可以接着消费产品
- //P:
- int i = 0;
- while (1)
- {
- //生产产品
- P(s1);//获得B
- //向B放产品
- i = (i+1)%n;//环状队列 向buffer[i]放产品
- V(s2);//通知C取产品
- }
- //C:
- int j = 0;
- while (1)
- {
- P(s2);//得到通知,获得B
- //取产品
- j = (j+1)%n;//环状向buffer[j]取产品
- V(s1);//通知P生产
- //消费产品
- }
// [10/9/2013 qingezha] 1生产者-1消费者-多缓冲区
//P进程不能往满的缓冲区放产品,设置信号量为s1
//C进程不能从空的缓冲区取得产品,设置信号量为s2
//s1的初值为n ,s2的初值为0,因为只有先生产产品才可以接着消费产品
//P:
int i = 0;
while (1)
{
//生产产品
P(s1);//获得B
//向B放产品
i = (i+1)%n;//环状队列 向buffer[i]放产品
V(s2);//通知C取产品
}
//C:
int j = 0;
while (1)
{
P(s2);//得到通知,获得B
//取产品
j = (j+1)%n;//环状向buffer[j]取产品
V(s1);//通知P生产
//消费产品
}
还有
M个生产者—K个消费者—N个缓冲区问题
待续!!