首页新闻找找看学习计划

操作系统进程同步问题——生产者消费者问题

0
悬赏园豆:20 [已解决问题] 解决于 2015-10-23 17:24
我会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)成对;

SharpeyeKardel的主页 SharpeyeKardel | 初学一级 | 园豆:30
提问于:2015-05-12 21:52
< >
分享
最佳答案
0

我懂了 谢谢

SharpeyeKardel | 初学一级 |园豆:30 | 2015-10-23 17:24
其他回答(2)
0

你先把生产消费是啥模式搞清楚,自然就明白你说的那些问题了。我不懂C现在,但是我能看懂意思,就是生产者会查看消费者是否在使用,数组是否已满;消费者会查看是否为空,是否生产者在插入;

收获园豆:20
代码小兵的成长 | 园豆:301 (菜鸟二级) | 2015-05-13 09:45
0

这就是个模式,一种类型的问题,网上有对应语言的算法可以看看。

淡淡的忧伤IT男 | 园豆:201 (菜鸟二级) | 2015-05-13 10:51
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册