如果一个生产者和一个消费者他们共享的缓冲IX(B)容量为可以存放n件物品,
如何使用PV操作来实现他们正确的同步?
设信号量empty(表示缓冲区中可存放多少件物品)的初值为n,信号量full(表示 缓冲区中存有几件物品)的初值为o。当缓冲区中没有放满n件物品时,生产者调用 P(empty)都不会成为等待状态而可把物品存人缓冲区。但当缓冲区中已经有n件物品时,生产者想再存入一件物品将被拒绝。每存一件物品后,由于调用V(full),故empty的值表示缓冲区中可用的物品数,只要full>O,消费者调用P(full)后总可去取物品。每取走一件物品后,由于调用V(empty),便增加了一个可用来存放物品的位置。用指针k和t分别指示生产者往缓冲区存物品和消费者从缓冲区中取物品的相对位置,它们的初值为0。那么,一个生产者和一个消费者共用容量为n的缓冲区时,可进行如下同步工作: 设信号量empty,full,初值为empty=n,full=0;整型变量k,t,初值为k=t=0。 生产者进程: begin L1:produce a product; P(empty); B[k]:=product; k:=(k+1)mod n; V(full); go to LI; end; 消费者进程: begin L2:P(full); take a product from B[t]; t:=(t+1)mod n; V(empty); consume; go to L2; end;