问答题
兄弟俩共同使用一个账号,每次限存或取10元,存钱与取钱的进程分别如下所示:
begin
amount:integer:
amount:=0;
cobegin
Process SAVE
m1:integer:
begin
m1:=amount:
m1:=m1+10;
amount:=m1;
end;
Process TAKE
m2:integer;
begin
m2:=amount;
m2:=m2-10;
amount:=m2;
end;
coend;
end;
由于兄弟俩可能同时存钱和取钱,因此两个进程是并发的。若哥哥先存了两次钱,但在第3次存钱的时候弟弟在取钱,请问最后账号amount上面可能出现的值?如何用P操作、V操作实现两并发进程的互斥执行?
【正确答案】
【答案解析】哥哥存两次钱后,amount=20,第三次存钱时,弟弟正在取钱,因没有对amount互斥操作,故发生错误。最后amount上可能出现的值应与两进程相对执行速度有关;若TAKE执行结束后SAVE才开始,则剩20元;若SAVE执行结束后TAKE才开始,也剩20元;问题就出在两个进程交替使用CPU时,则会出现不同值。关键在于最后被执行的语句是amount:=m1,还是amount:=m2,若先amount:=m1后amount:=m2,则amount=10,反之,先amount:=m2后amount:=m1,则amount=30。设信号量mutex(初值为1)控制两进程对变量amount的互斥使用。正确过程如下:
begin
amount:integer;
amount:=0;
cobegin
Process SAVE
m1:integer;
Begin
P(mutex);
m1:=amount;
m1:=m1+10;
amount:=m1;
V(mutex);
end;
Process TAKE
m2:integer;
Begin
P(mutex);
m2:=amount;
m2:=m2-10;
amount:=m2;
V(mutex);
end;
coend;
end;