SICP問題3.43

三つの口座をx, y, zとし、最初の口座の残高を x=10, y=20, z=30とする。

残高交換のプロセスを分解すると

1. 口座a1の残高確認
2. 口座a2の残高確認
3. 1時点の口座a1の残高と、2時点の口座a2の残高の差を取得
4. 口座a1からの払い出し
4.1. 口座a1の残高-3.の金額を算出する
4.2. 口座a1の残高を4.1.の金額で更新する
5. 口座a2への預け入れ
5.1. 口座a2の残高+3.の金額を算出する
5.2. 口座a2の残高を5.1.の金額で更新する

となる

プロセスが逐次的に走った場合、上の1〜5が完了するまで他のプロセスからは各口座の残高は変更されないので、a1とa2の入れ替えのみが行われる。これは口座の数が三つになっても同じであり、x, y, zの口座の残高は 10, 20, 30のいずれかになる。

P1はx, yを、P2はx, zを入れ替えるプロセスだとすると、口座交換プログラムの最初の版では以下の動作を行い、残高が10, 20, 30とならない可能性がある。

x    y    z       P1                     P2
10   20   30      1.   a1:10             1.   a1:10
                  2.   a2:20             2.   a2:30
                  3.   -10               3.   -20
                  4.1. 10-(-10)=20
20   20   30      4.2. a1:20
                  5.1. 20+(-10)=10
20   10   30      5.2. a2:10
                                         4.1. 20-(-20)=40
40   10   30                             4.2. a1:40
                                         5.1. 30+(-20)=10
40   10   10                             5.2. a2:10

x, y, zの口座の残高の合計が変わらない理由は以下のとおり。
払い出しと預け入れ(4.と5.)の部分が直列化されているため、この部分については同時実行はない。よって交換後の残高の合計は以下の式のように、

(x - P1の差 - P2の差) + (y + P1の差) + (z + P2の差)
= x + y + z

となり、元の残高の合計と同じとなる。

払い出しと預け入れ(4.と5.)の部分が直列化されていない場合は、以下の動作を行い、残高の合計が10+20+30=60でなくなる可能性がる。
P1, P2, x, y, zの定義は上と同じ。

x    y    z       P1                     P2
10   20   30      1.   a1:10             1.   a1:10
                  2.   a2:20             2.   a2:30
                  3.   -10               3.   -20
                  4.1. 10-(-10)=20
                                         4.1. 20-(-20)=40
40   20   30                             4.2. a1:40
20   20   30      4.2. a1:20
                  5.1. 20+(-10)=10
20   10   30      5.2. a2:10
                                         5.1. 30+(-20)=10
20   10   10                             5.2. a2:10