【正确答案】正确答案:本题的解答采用分离的信号量来实现,可以比较清楚地看到操作的过程。 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格的缓冲区,而消费者只需要读出属于自己格子的消息即可,当所有的格子读空以后,这个缓冲区就可以接纳下一个生产者的写入。分析清楚其工作机制,我们可以从经典的生产者和消费者问题出发,来设计相应的信号量。信号量的设计可以是信号量组,也可以采用分离的信号量来实现。