一个关于生产者与消费者的问题

时间:2022-03-24 19:36:31
在由9个生产者,6个消费者,共享容量为8的缓冲器组成的生产者与消费者问题中,互斥使用缓冲器的信号量mutex的初值应该为() 

书中注释答案为6 
                                        ---选(北京工业出版社 P33.26) 
我是用"8+6-9+1=6",这是我蒙上的,我去查了信号量的知识,但实在还是不懂,恳请会此算法的人帮助,谢谢 

11 个解决方案

#1


答案不是6,是1.

#2


问:m个生产者,n个消费者,容量为r的缓冲区,(m,n,r都大于1),要求生产者和消费者互斥存取物品.
       解:1)生产者和消费者之间要同步,类似问题一,用两个信号量empty,full;2)m个生产者之间要互斥,n个消费者之间也要互斥,同时要求生产者和消费者互斥存取物品,因此设两个计数器in,out和一个互斥信号量mutex.

代码:



begin
                buffer:array[0r-1]: integer
                in,out:integer=0,0;
                empty=r,full=0, mutex=1:semaphore;
                cobegin
                    process Producer-i(i=1,2m)
                    begin
                        L1:生产一件物品;
                        wait(empty)
                        wait(mutex)
                         buffer[in] = product;
                         in = (in+1)mod r;
                        signal(mutex)
                        signal(full)
                        goto L1;
                    end
                    process Consumer-j(j=1,2n)
                    begin
                        L2: wait(full)
                        wait(mutex)
                        take  a product from buffer[out];
                        out =(out+1)mod r;
                        signal(mutex)
                        signal(empty)
                        消费一件物品;
                        goto L2;
                    end
初值都是1.

#3


我已将您的解释抄下,拿回去,我再好好理解消化一下,谢谢

#4


复制黏贴就行了,抄下来太累了,而且会抄错掉.

#5


我也很想这样,“复制,粘贴”,但我在网吧上网,不能用USB接口,条件所限,没办法,呵呵

#6


可以发邮件发回家.

#7


该回复于2009-10-14 17:15:02被版主删除

#8


该回复于2009-10-14 17:15:02被版主删除

#9


该回复于2009-10-14 17:15:02被版主删除

#10


再问您一下,您上面的代码是 “汇编”吗

#11


引用 10 楼 pass299 的回复:
再问您一下,您上面的代码是 “汇编”吗

pascal吧,呵呵

#1


答案不是6,是1.

#2


问:m个生产者,n个消费者,容量为r的缓冲区,(m,n,r都大于1),要求生产者和消费者互斥存取物品.
       解:1)生产者和消费者之间要同步,类似问题一,用两个信号量empty,full;2)m个生产者之间要互斥,n个消费者之间也要互斥,同时要求生产者和消费者互斥存取物品,因此设两个计数器in,out和一个互斥信号量mutex.

代码:



begin
                buffer:array[0r-1]: integer
                in,out:integer=0,0;
                empty=r,full=0, mutex=1:semaphore;
                cobegin
                    process Producer-i(i=1,2m)
                    begin
                        L1:生产一件物品;
                        wait(empty)
                        wait(mutex)
                         buffer[in] = product;
                         in = (in+1)mod r;
                        signal(mutex)
                        signal(full)
                        goto L1;
                    end
                    process Consumer-j(j=1,2n)
                    begin
                        L2: wait(full)
                        wait(mutex)
                        take  a product from buffer[out];
                        out =(out+1)mod r;
                        signal(mutex)
                        signal(empty)
                        消费一件物品;
                        goto L2;
                    end
初值都是1.

#3


我已将您的解释抄下,拿回去,我再好好理解消化一下,谢谢

#4


复制黏贴就行了,抄下来太累了,而且会抄错掉.

#5


我也很想这样,“复制,粘贴”,但我在网吧上网,不能用USB接口,条件所限,没办法,呵呵

#6


可以发邮件发回家.

#7


该回复于2009-10-14 17:15:02被版主删除

#8


该回复于2009-10-14 17:15:02被版主删除

#9


该回复于2009-10-14 17:15:02被版主删除

#10


再问您一下,您上面的代码是 “汇编”吗

#11


引用 10 楼 pass299 的回复:
再问您一下,您上面的代码是 “汇编”吗

pascal吧,呵呵