我会C语言,可是对计算机操作系统教科书上的生产者消费者问题的代码描述看不懂,理解不了。【到底这个代码执行流程是怎样的?】
(记录型信号量解决生产者消费者问题)
变量说明:
n为生产者和消费者之间的公用缓冲池中的n个缓冲区;
mutex为互斥信号量,实现诸进程对缓冲池的互斥作用;
信号量empty和full分别表示缓冲池中空缓冲区和满缓冲区的数量;
假定生产者和消费者相互等效,只要缓冲池未满,生产者便可将消息送入缓冲池;只要缓冲池未空,消费者便可从缓冲池中取走一条信息。
代码如下:
int in=0, out =0; item buffer[n]; semaphore mutex =1, empty = n, full=0; void proceducer() { do{ producer an item nextp; ... //中间代码 wait(empty); wait(mutex); buffer[in] = nextp; in := (in + 1)%n; signal(mutex); signal(full); }while(TRUE) } void consumer() { do{ wait(full); wait(mutex); nextc = buffer[out]; out = (out + 1)%n; signal(mutex); signal(empty); consumer the item in nextc; ……//中间代码 }while(TRUE) } void main() { cobegin proceducer(); consumer(); coend }
为什么在proceducer()函数中,wait(empty)和signal(full)成对出现;
在consumer()中wait(full)和signal(empty)成对出现。而不是wait(empty)和signal(empty)、wait(full)和signal(full)成对;
我懂了 谢谢
你先把生产消费是啥模式搞清楚,自然就明白你说的那些问题了。我不懂C现在,但是我能看懂意思,就是生产者会查看消费者是否在使用,数组是否已满;消费者会查看是否为空,是否生产者在插入;
这就是个模式,一种类型的问题,网上有对应语言的算法可以看看。