生产者-消费者问题类
- 由三个进程get,copy和put以及两个缓冲区buffer1和buffer2完成一项输入/输出操作。进程get的功能是把一张卡片上的信息从读卡机上读进buffer1;进程copy的功能是把buffer1中的信息复制到buffer2;进程put的功能是取出buffer2中的信息并从打印机上打印输出。试用P、V操作完成这三个进程间的尽可能并发正确执行的关系(用程序或框图表示),并指明信号量的作用和初值。
分析:可设置6个信号量mutex1,mutex2,empty1,empty2,full1,full2。
mutex1和mutex2是互斥信号量,初值为1,分别用于对buffer1和buffer2的互斥访问;
empty1和empty2为同步信号量,初值为1,分别表示buffer1和buffer2是否空闲,1表示空闲,0表示不空闲;
full1和full2为同步信号量,初值为0,分别表示buffer1和buffer2中是否有可取用的信息,1表示有可取用的信息,0表示无可取用的信息。semaphore mutex1, mutex2, empty1, empty2, full1, full2 ; mutex1=mutex2=1; //互斥信号量 empty1=empty2=1; //生产者进程的同步信号量 full1=full2=0; //消费者进程的同步信号量 parbegin process get( ) //读进程(生产者进程) { while (1) { 从读卡机读入一张卡片的信息; P(empty1); //看看buffer1是否空闲 P(mutex1); //互斥访问buffer1 将信息放入buffer1; V(mutex1); V(full1); //通知进程copy,buffer1中已有信息可取(若copy正在等待,则唤醒之) } } process copy( ) //复制进程(既是消费者又是生产者进程) { while (1) { P(full1) //看看buffer1是否有信息可取 P(mutex1); //互斥访问buffer1 从buffer1中复制出信息; V(mutex1); V(emtpy1); //通知get,buffer1中的信息已取走(可能唤醒get) P(empty2); //看看buffer2是否空闲 P(mutex2); //互斥访问buffer2 将复制的信息放入buffer2; V(mutex2); V(full2); //通知put,buffer2中已有信息 }