本文记录9道PV问题的解,不保证正确,仅供参考,,
1、 有一个仓库,可以存放 A 和 B 两种产品,仓库的存储空间足够大,但要求:
( 1)一次只能存入一种产品( A 或 B);
( 2) -N < (A 产品数量-B 产品数量) < M。
其中, N 和 M 是正整数。试用“存放 A”和“存放 B”以及 P、 V 操作描述产品 A 与
产品 B 的入库过程。
1 Semaphore mutex = 1; //互斥信号量 2 Semaphore a = M-1 ; //存放A的资源信号量,初值为M-1 3 Semaphore b = N-1; //存放B的资源信号量,初值为N-1 4 存放 A: 5 { 6 while(true) 7 { 8 Get A; 9 P(&a); 10 P(&mutex); 11 Put A; 12 V(&mutex); 13 V(&b); 14 } 15 } 16 存放B: 17 { 18 while(true) 19 { 20 Get B; 21 P(&b); 22 P(&mutex); 23 Put B; 24 V(&mutex); 25 V(&a); 26 } 27 }
2、 桌子上有一只盘子,最多可容纳两个水果,每次只能放入或取出一个水果。爸爸专向盘
子放苹果( apple),妈妈专向盘子中放桔子( orange);两个儿子专等吃盘子中的桔子,
两个女儿专等吃盘子中的苹果。请用 P、 V 操作来实现爸爸、妈妈、儿子、女儿之间的
同步与互斥关系。
1 Semaphore mutex = 1; //互斥信号量, 其初值为1 2 Semaphore empty = 2; //记录允许向盘子中放入水果的个数,初值为2 3 Semaphore orange = 0; //盘子中已放入的苹果的个数,初值为0 4 Semaphore apple = 0; //盘子中已放入的桔子的个数,初值为0 5 main() 6 { 7 Cobegin 8 { 9 father //父亲进程 10 { 11 while (true) 12 { 13 P(empty); //减少盘中可放入的水果数 14 P(mutex); //申请向盘中取、放水果 15 向盘中放苹果; 16 V(mutex); //允许向盘中取、放水果 17 V(apple); //递增盘中的苹果数 18 } 19 } 20 mother //母亲进程 21 { 22 while (true) 23 { 24 P(empty); //减少盘中可放入的水果数 25 P(mutex); //申请向盘中取、放水果 26 向盘中放桔子; 27 V(mutex); //允许向盘中取、放水果 28 V(orange); //递增盘中的桔子数 29 } 30 } 31 daughteri(i=1,2) //两女儿进程 32 { 33 while (true) 34 { 35 P(apple); //减少盘中苹果数 36 P(mutex); //申请向盘中取、放水果 37 取盘中苹果; 38 V(mutex); //允许向盘中取、放水果 39 V(empty); //递增盘中可放入的水果数 40 } 41 } 42 sonj(j=1,2) //两儿子进程 43 { 44 while (true) 45 { 46 P(orange); //减少盘中桔子数 47 P(mutex); //申请向盘中取、放水果 48 取盘中桔子; 49 V(mutex); //允许向盘中取、放水果 50 V(empty); //递增盘中可放入的水果数 51 } 52 } 53 } 54 Coend 55 }
3、 有一个理发师,一把理发椅和 N 把供等候理发的顾客坐的椅子。如果没有顾客,则理发
师便在理发师椅子上睡觉;当一个顾客到来时,必须唤醒理发师进行理发;如果理发师
正在理发时又有顾客来到,则如果有空椅子可坐,他就坐下来等,如果没有空椅子,他