Producer - Consumer Problem
--(about process cooperation)
data description:
buffer[ ] 生产者和消费者的共享缓冲队列;
BUF_SIZE 缓冲队列的全部可用长度;
in 生产者的下一个产品的铺位;(要求为空)
out 消费者的下一次消费的铺位;(要求非空)
sign 用于标识下述两种状态:生产者铺位是否向前绕到了消费者尾部和消费者是否追赶到生产者尾部,追尾即为1,否则为0;
intial state:
in = out = 0;
buffer = (ProductionType *)malloc( BUF_SIZE * sizeof(ProductionType) );
producer process:
consumer process:
ProductionType consume(
void
)
... {
ProductionType temp;
while( !sign ) ; //hang on
temp = buffer[out]; //data copy cost...
if( (out+1)%BUF_SIZE == in )
sign = ! sign;
out = (out+1)%BUF_SIZE;
return temp;
}
... {
ProductionType temp;
while( !sign ) ; //hang on
temp = buffer[out]; //data copy cost...
if( (out+1)%BUF_SIZE == in )
sign = ! sign;
out = (out+1)%BUF_SIZE;
return temp;
}
一般使用BUF_SIZE-1个缓冲空间的算法是最简单的,进程协作状态完全可以通过二者的铺位计算出来;当共享的缓冲区扩大到BUF_SIZE时,主要是缓冲空和缓冲满这两种状态使用原来的计算方法无法区分了,只有增加一个辅助的标志位:追尾指示灯:-)
不知道这种办法用硬件的方法实现起来会有怎样的变数。终究来说,这样的开销争执好像没什么意义,我又没有听Tanenbaum的话了。。。。。
Product( ProductionType ToFeedIn )
... {
while( !sign ) ;//wait, process hang on
buffer[in] = ToFeedIn;//feed buffer
if( (in+1)%BUF_SIZE == out ) //rear-ending occur!!!
sign = ! sign; //brake
in = (in+1)%BUF_SIZE;
}
... {
while( !sign ) ;//wait, process hang on
buffer[in] = ToFeedIn;//feed buffer
if( (in+1)%BUF_SIZE == out ) //rear-ending occur!!!
sign = ! sign; //brake
in = (in+1)%BUF_SIZE;
}