Sa,Sb,Sc是已定义的信号量,初始值为1、0、0;x,y,z是公共变量,下面三个并发程序段执行后,x=19,y=10,z=28;
prA(){
P(Sc);
z=x+y;
V(Sb);
}
prB(){
y=18;
P(Sb);
V(Sa);
P(Sb);
y=z-y;
V(Sa);
}
prC(){
P(Sa);
x=10;
V(Sb);
P(Sa);
X=z-9;
}
解释:
首先弄清P、V的含义,
P:wait(<0阻塞),V:signal(<=0唤醒)
确定信号量的初始值:发现Sa=1;即先从prC开始执行:
{
P(sa),使Sa=0;->可以执行,得x=10;
紧接后面V(Sb)且P(Sa),使Sb=1同时prC这个进程发生阻塞;
}
紧接Sb=1,执行prB:
{
y=18;P(Sb)使Sb=0;然后旁边是V(Sc)且P(Sb):意味着prB进程阻塞和Sc=1;
}
Sc=1,所以执行prA:
{
P(Sc)使Sc=0;z=x+y=10+18,即z=28;
接下来V(Sb)使Sb=1;
}
Sb=1即刚刚被阻塞的prB可以执行了:
{
y=z-y=28-18=10;
接下来:V(Sa)使Sa=1;
}
Sa=1可以执行刚刚被阻塞的prC:
{
x=z-9=28-9=19
}、
所以:x=19,y=10,z=28