有两个进程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版,可是这里人较多,就发这了,请版竹谅解.

解决方案 »

  1.   

    应该怎样理解?寄存器相关?我不懂寄存器哦.但我想寄存器本质上也是地址单元吧,count是一个变量,所以:
    1: R1=count=6;
      P2: R2=count=6;
      P1: R1=R1+1=7;
        count=R1=7;------>在这里,count地址单元的值改为了7
      P2: R2=R2+1=7+1=8;------>在这里,count地址单元的值改为了7+1,你看是吗?
        count=R2=8;
      

  2.   

    好像是这样解释的:那count为6说吧
    P1: R1=count;//count存入R1中,R1中存的6
    P2: R2=count;//count存入R2中,R2中存的6
    P1: R1=R1+1;//R1中的值+1,R1中存的6+1=7
    count=R1;//R1中的值赋给count,count为7
    P2: R2=R2+1;//R2中的值+1,R2中存6+1=7
    count=R2;//R2中的值赋给count,count为7
      

  3.   

    P2: R2=R2+1=7+1=8;------>在这里,count地址单元的值改为了7+1,你看是吗?
    ===
    寄存器里存的是变量count,不是地址
    就按地址解释吧,你这里也不对,R2之前没有变呀,一直是6
    这里还是6+1=7
      

  4.   

    int i=6;
    int temp1,temp2;
    temp1=i;
    temp2=i;
    temp1=temp1+1;
    i=temp1;
    temp2=temp2+1;
    i=temp2;
    按程序解释,你看看i的值