}
coend
get() { }
compute() { }
while(计算工作未完成) { }
p(Sf);
从缓冲区中取出数据; v(Se); 进行数据计算; while (采集工作未完成) { }
采集一个数据: p(Se);
将数据送入缓冲区中; v(Sf);
图2.7给出了四个进程合作完成某一任务的前趋图,试说明这四个进程间的同步关系,并用P、V操作描述它。P35
图2.7 四个合作进程的前趋图
解:图2.7说明任务启动后S1先执行。当S1结束后,S2、S3可以开始执行。S2、S3
完成后,S4才能开始执行。为了确保这一执行顺序,设三个同步信号量b2、b3、b4分别
表示进程S2、S3、S4是否可以开始执行,其初值均为0。这四个进程的同步描述如下:
int b2=0; /*表示进程S2是否可以开始执行*/ int b3=0; /*表示进程S3是否可以开始执行*/
第 21 页 共 37 页
int b4=0; /*表示进程S4是否可以开始执行*/ main() {
cobegin
S1 ( ); S2 ( ); S3 ( ); S4 ( ); coend }
S1 ( ) {
┇
v(b2); v(b3); } S2 ( ) {
p(b2); ┇
v(b4); }
S3 ( ) {
p(b3): ┇ v(b4); }
S4 ( ) {
p(b4);
p(b4); /*因在S2及S3完成时均对b4做了v操作,因此这里要用两个p操作*/ ┇ }
8. 桌上有一空盘,允许存放一只水果。爸爸可向盘中放苹果,也可向盘中放桔子,儿子专
等吃盘中的桔子,女儿专等吃盘中的苹果。规定当盘空时一次只能放一只水果供吃者用,请用P、V原语实现爸爸、儿子、女儿三个并发进程的同步。
[分析及相关知识] 在本题中,爸爸、儿子、女儿共用一个盘子,且盘中一次只能放一个水果.当盘子为空时,爸爸可将一个水果放入果盘中。若放入果盘中的是桔子,则允许儿子
第 22 页 共 37 页
吃,女儿必须等待;若放入果盘中的是苹果,则允许女儿吃,儿子必须等待。本题实际上是生产者—消费者问题的一种变形。这里,生产者放入缓冲区的产品有两类,消费者也有两类,每类消费者只消费其中固定的一类产品。
解:在本题中,应设置三个信号量S、So、Sa,信号量S表示盘子是否为空,其初值 为1;信号量So表示盘中是否有桔子,其初值为0;信号量Sa表示盘中是否有苹果,其初 值为0。同步描述如下: int S=1; int Sa=O: int So=O: main( ) { cobegin father(); son();
dau