实验目的:
- 熟悉JBACI实验环境
- 了解程序顺序执行及并发执行方式的区别;
- 熟悉如何利用gannt图描述线程组执行特征。
实验内容:
- 比较图1-1和图1-2程序的执行结果,绘制图1-2至少两种不同执行序列的gannt图 ;
图1-1 incr.cm 图 1-2 currencyincy.cm
图1-1执行结果:
图1-2执行结果:
- 执行图1-3程序,观察所有可能出现的输出结果,分析得出这些结果的执行顺序。
图1-3 aandb.cm
图1-3的三种可能的执行结果:
执行顺序为:x=1;x=x+5;y=4;y=y+x
执行顺序为:x=1;y=4;y=y+x;x=x+5;
执行顺序为:y=4;y=y+x;x=1;x=x+5;
图1-4程序说明了如何使用信号量控制程序的执行顺序,请参考该程序并实现下列执行顺序:
-
- x=1; y=y+x; y=4; x=x+5;
- y=4; x=1; y=y+x; x=x+5;
- x=1; y=4; x=x+5; y=y+x;
- y=4; x=1; x=x+5; y=y+x;
图1-4 信号量控制
程序[1]:semaphore sx = 0, sy = 0;
void a(){x = 1; y = y + x; v(sx);}
void b(){p(sx); y = 4; x = x+5;}
void main(){
cobegin{a(); b();}
cout<<"x="<<x<<"\ty="<<y<<endl;
}
运行结果:
程序[2]:semaphore sx = 0, sy = 0;
void a(){p(sx); x = 1; y = y + x; v(sy);}
void b(){y = 4; v(sx); p(sy); x = x+5;}
void main(){
cobegin{a(); b();}
cout<<"x="<<x<<"\ty="<<y<<endl;
}
运行结果:
程序[3]:semaphore sx = 0, sy = 0;
void a(){x = 1; v(sx); p(sy); y = y + x;}
void b(){p(sx); y = 4; x = x+5; v(sy);}
void main(){
cobegin{a(); b();}
cout<<"x="<<x<<"\ty="<<y<<endl;
}
运行结果:
程序[4]:semaphore sx = 0, sy = 0, sz = 0;
void a(){p(sx); x = 1;v(sy); p(sz); y = y + x;}
void b(){y = 4; v(sx); p(sy); x = x+5; v(sz);}
void main(){
cobegin{a(); b();}
cout<<"x="<<x<<"\ty="<<y<<endl;
}
运行结果:
甘特图:
图1-2-1的gannt图:
图1-2-2的gannt图: