有n个生产者进程向1个有限的缓冲区不断地发送消息,这些消息通过缓冲区分发到m个消费者,缓冲区的大小只可以存放1条消息。生产者和消费者的工作遵循如下规则: (1)生产者和消费者对缓冲区的访问互斥; (2)对每1条放入缓冲区的消息,所有消费者都

admin2013-07-12  32

问题 有n个生产者进程向1个有限的缓冲区不断地发送消息,这些消息通过缓冲区分发到m个消费者,缓冲区的大小只可以存放1条消息。生产者和消费者的工作遵循如下规则:
    (1)生产者和消费者对缓冲区的访问互斥;
    (2)对每1条放入缓冲区的消息,所有消费者都必须接收1次;
    (3)缓冲区满时,生产者必须阻塞,缓冲区空时,消费者阻塞。
    请用信号量和P、V操作组织正确的发送和接收。用类C语言进行描述。

选项

答案本题的解答采用分离的信号量来实现,可以比较清楚地看到操作的过程。 typedef int semaphore; //定义信号量 semaphore mutex; //缓冲区互斥信号量用于读写互斥 semaphore empty[m]={1,1,…,1}; //当前缓冲区所有格子为空 serflaphore grid[m]={0,0,…,0); //缓冲区的每个格子满的信号量 void producer( ) //生产者 {int i,buffer; while(1) //并发调度 {message:produce( ); //生产者生产消息 for(i=0,i
解析 本题是经典的生产者和消费者问题的变形。在经典的生产者和消费者的模型中,生产者和消费者共用一组缓冲区,生产者向缓冲区中写入一次数据,消费者从缓冲区中读出一次数据,即写一次,读一次。本题中,生产者向缓冲区中只写一次,但是每个消费者却都要读一次。对于此类问题,可以把缓冲区看成是m格的缓冲区阵列,这样一来,生产者每写一次缓冲区,相当于填满了一块m格的缓冲区,而消费者只需要读出属于自己格子的消息即可,当所有的格子读空以后,这个缓冲区就可以接纳下一个生产者的写入。分析清楚其工作机制,我们可以从经典的生产者和消费者问题出发,来设计相应的信号量。信号量的设计可以是信号量组,也可以采用分离的信号量来实现。
转载请注明原文地址:https://kaotiyun.com/show/nuxi777K
0

最新回复(0)