没有睡觉的达人过帮忙看一下,在线等等!

teacher1998 2006-05-11 12:49:06
有两个进程P1和P2共享变量count,当进程P1,P2按下述顺序执行时一次为(R1和R2是处理机中寄存器):

  P1: R1=count;
    R1=R1+1;
     count=R1;

  P2:  R2=count;
     R2=R2+1;
     count=R2;

  其结果使count增加了2,正确;但当P1和P2按另一种顺序对变量count修改,即交叉执行一次,例如:

  P1: R1=count;
  P2: R2=count;
  P1: R1=R1+1;
    count=R1;
  P2: R2=R2+1;
    count=R2;

  虽然P1和P2都各自对count做了一次加1操作,但count最后的结果仅增加了1,因为P1加1操作无效,发生了与执行顺序有关的错误。为了预防这种错误的发生,对变量count也应按临界资源处理,即采取措施强迫P1和P2顺序访问count,即互斥访问count。

在上面的互斥的例子中,第一个我懂,可是第二个中说到:
但count最后的结果仅增加了1,因为P1加1操作无效,发生了与执行顺序有关的错误

这句话该怎么理解?为什么P1加1无效?从哪里看出发生了与执行顺序有关的错误?
if count=6 那么按照:

P1: R1=count;
  P2: R2=count;
  P1: R1=R1+1;
    count=R1;
  P2: R2=R2+1;
    count=R2;
有:
P1: R1=count=6;
  P2: R2=count=6;
  P1: R1=R1+1=7;
    count=R1=7;
  P2: R2=R2+1=7+1=8;
    count=R2=8;
结果还是加了2啊!

请达人解惑,;谢!
另,本来想发到os版,可是这里人较多,就发这了,请版竹谅解.
...全文
146 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
teacher1998 2006-05-11
  • 打赏
  • 举报
回复
没有懂这个的吗?>
teacher1998 2006-05-11
  • 打赏
  • 举报
回复
sos啊
teacher1998 2006-05-11
  • 打赏
  • 举报
回复
自已先顶一下.
wuyi8808 2006-05-11
  • 打赏
  • 举报
回复
P1:R1=count=6;
P2: R2=count=6; // R2=6
P1: R1=R1+1=7;
  count=R1=7;
P2: R2=R2+1=6+1=7; // 注意R2=6
  count=R2=7;
lordych 2006-05-11
  • 打赏
  • 举报
回复
老大人家没用count = [R1]这种啊,不要想得太复杂,本来就是传值。
boy_qiqi 2006-05-11
  • 打赏
  • 举报
回复
如果你的r1 r2是指针,比如
int *r1,*r2;
int count=6;
r1=&count;
r2=&count;
*r1+=1;
*r2+=1;
那么*r1和*r2的值都是8,因为是引用,不是传值
boy_qiqi 2006-05-11
  • 打赏
  • 举报
回复
P1: R1=count=6;
  P2: R2=count=6; // R2已经取出了count值了,现在是6
  P1: R1=R1+1=7;
    count=R1=7 //内存里的count变成7了,但是R2取得是刚才的值6
  P2: R2=R2+1=7+1=8 //R2一直都是6,除非他重新取一次count值
    count=R2=8;
teacher1998 2006-05-11
  • 打赏
  • 举报
回复
为什么说P1加的1是无效的?
从哪看出来的?
teacher1998 2006-05-11
  • 打赏
  • 举报
回复
楼上的还在吧? 我没有写错吧?
P1: R1=count=6;
  P2: R2=count=6;
  P1: R1=R1+1=7;
    count=R1=7;--->这里在内存中Count的值不是已经变成7了吗?
  P2: R2=R2+1=7+1=8;--->所以这里我想应该是7+1啊
    count=R2=8;
boy_qiqi 2006-05-11
  • 打赏
  • 举报
回复
你上面的写错了一个吧
P1: R1=count=6;
  P2: R2=count=6;
  P1: R1=R1+1=7;
    count=R1=7;
  P2: R2=R2+1=7+1=8; // 我认为应该是R2=R2+1=6+1=7 ,而不是8,因为P1加的1是无效的
    count=R2=8;

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧