生产者与消费者问题
1生产者与消费者问题
int full = 0; / 满缓冲单元的数目
int mutex = 1; / 对缓冲区进行操作的互斥信号量
void producer( void );
void consumer( void );
int main( void )
{
cobegin
producer();
consumer();
coend
}
void produceri( void )
{
while( 生产未完成 ) {
生产一个产品;
p( mutex );
送一个产品到有界缓冲区;
v( mutex );
v( full );
}
}
consumerj
{
while( 还要继续消费 ) {
p( full );
p( mutex );
从有界缓冲区中取产品;
v( mutex );
消费一个产品;
}
}
2 有界缓冲问题
有m 个生产者和k 个消费者,共享存放n 个产品的缓冲单元。用PV 操作进行控制
第一种算法:任意时刻,同时仅允许1个生产者和1个消费者进入的算法
int full = 0; / 满缓冲单元的数目
int empty = n; / 空缓冲单元的数目
int mutex1 = 1; / 对有界缓冲区进行操作用于生产者间的互斥信号量
int mutex2 = 1; / 对有界缓冲区进行操作用于消费者间的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
cobegin
produceri(); / i = 1,2,…,m
consumerj(); / j = 1,2,…,k
coend
}
void produceri( void )
{
while( 生产未完成 ) {
生产一个产品;
p( empty );
p( mutex1 );
送一个产品到有界缓冲区;
v( mutex1 );
v( full );
}
}
viod consumerj( void ){
while( 还要继续消费 ) {
p( full );
p( mutex2 );
从有界缓冲区中取产品;
v( mutex2 );
v( empty );
消费一个产品;
}
}
第二种算法:任意时刻,只允许1个生产者或1个消费者进入的算法
int full = 0; / 满缓冲单元的数目
int empty = n; / 空缓冲单元的数目
int mutex = 1; / 对有界缓冲区进行操作的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
cobegin
produceri(); / i = 1,2,…,m
consumerj(); / j = 1,2,…,k
coend
}
void produceri( void )
{
while( 生产未完成 ) {
生产一个产品;
p( empty );
p( mutex );
送一个产品到有界缓冲区;
v( mutex );
v( full );
}
}
viod consumerj( void ){
while( 还要继续消费 ) {
p( full );
p( mutex );
从有界缓冲区中取产品;
v( mutex );
v( empty );
.
.
.
消费一个产品;
}
}
3 无界缓冲问题
有m 个生产者和k 个消费者,共享存放无数个产品的缓冲单元。用PV 操作进行控制
第一种算法:
int full = 0; / 满缓冲单元的数目
int mutex = 1; / 对有界缓冲区进行操作的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
cobegin
produceri(); / i = 1,2,…,m
consumerj(); / j = 1,2,…,k
coend
}
void produceri( void )
{
while( 生产未完成 ) {
生产一个产品;
p( mutex );
送一个产品到有界缓冲区;
v( mutex );
v( full );
}
}
viod consumerj( void )
{
while( 还要继续消费 ) {
p( full );
p( mutex );
从有界缓冲区中取产品;
v( mutex );
消费一个产品;
}
}
第二种算法:定义一正整数 N,表示缓冲区当前存放的产品数( 包括 n = 0 )
int full = 0; / 满缓冲单元的数目
int mutex = 1; / 对有界缓冲区进行操作的互斥信号量
void produceri( void );
void consumerj( void );
int main( void )
{
cobegin
produceri(); / i = 1,2,…,m
consumerj(); / j = 1,2,…,k
coend
}
void produceri( void )
{
while( 生产未完成 ) {
生产一个产品;
p( mutex );
送一个产品到有界缓冲区;
if( n == 1 )
v( full );
v( mutex );
}
}
viod consumerj( void )
{
while( 还要